#c# #asp.net
#c# #asp.net
Вопрос:
У меня на моей странице есть два выпадающих списка, detailsview и элемент управления formview. Первый выпадающий список содержит список категорий книг, в то время как второй выпадающий список содержит список книг, основанный на выбранном значении первого выпадающего списка, и, наконец, detailsview, который показывает подробности второго выпадающего списка. Formview, с другой стороны, не имеет никакого контроля, и я просто использую его, чтобы получить значение из detailsview для вставки записи на основе второго выбранного выпадающего списка. Итак, что я хочу сделать, это скрыть formview, если второй выпадающий список пуст.
Это немного неясно, но короче говоря, я просто хочу скрыть formview, если во втором выпадающем списке не выбрано значение (и показать, есть ли оно).
Я приложил свой пример кода. Я надеюсь, вы смогли понять.
Заранее спасибо
<p>
Book Reservation</p>
<p>
<asp:DropDownList ID="DropDownList1" runat="server" AppendDataBoundItems="True"
AutoPostBack="True" DataSourceID="categoryDataSource" DataTextField="name"
DataValueField="categoryid" >
<asp:ListItem Selected="True" Value="">-- Choose a category --</asp:ListItem>
</asp:DropDownList>
<asp:SqlDataSource ID="categoryDataSource" runat="server"
ConnectionString="<%$ ConnectionStrings:LibrarySystemConnectionString %>"
SelectCommand="SELECT [categoryid], [name] FROM [TblCategory]" >
</asp:SqlDataSource>
</p>
<p>
<asp:DropDownList ID="DropDownList2" runat="server"
AutoPostBack="True" DataSourceID="booktitleDataSource"
DataTextField="booktitle" DataValueField="bookid" OnDataBound="DetailsView1_DataBound" >
<asp:ListItem Selected="True" Value="-1">-- Choose a book --</asp:ListItem>
</asp:DropDownList>
<asp:SqlDataSource ID="booktitleDataSource" runat="server"
ConnectionString="<%$ ConnectionStrings:LibrarySystemConnectionString %>"
SelectCommand="SELECT [bookid], [booktitle], [categoryid] FROM [TblBooks] WHERE ([categoryid] = @categoryid)">
<SelectParameters>
<asp:ControlParameter ControlID="DropDownList1" Name="categoryid"
PropertyName="SelectedValue" Type="Int32" />
</SelectParameters>
</asp:SqlDataSource>
</p>
<p>
<asp:DetailsView ID="DetailsView1" runat="server" AutoGenerateRows="False"
DataKeyNames="bookid" DataSourceID="bookdetailsDataSource" >
<HeaderTemplate>
<b>BOOK DETAILS</b>
</HeaderTemplate>
<FooterTemplate>
<b>RESERVED BY</b>
<asp:GridView ID="GridView1" runat="server" AllowPaging="True" AllowSorting="True"
AutoGenerateColumns="False" DataKeyNames="reservationid"
DataSourceID="reserveDataSource">
<Columns>
<asp:BoundField DataField="EmployeeID" HeaderText="Employee PIN"
SortExpression="EmployeeID" />
<asp:BoundField DataField="reservedate" HeaderText="Reserve date"
SortExpression="reservedate" />
</Columns>
</asp:GridView>
<asp:SqlDataSource ID="resereDataSource" runat="server" ConnectionString="<%$ ConnectionStrings:LibrarySystemConnectionString %>"
SelectCommand="SELECT dbo.BookReservation.reservationid,dbo.BookReservation.bookid, dbo.BookReservation.EmployeeID,
dbo.BookReservation.reservedate, dbo.BookReservation.isapproved, dbo.BookReservation.reschedule, dbo.BookReservation.isdeleted,
dbo.TblBooks.booktitle FROM dbo.BookReservation INNER JOIN dbo.TblBooks ON dbo.BookReservation.bookid = dbo.TblBooks.bookid WHERE (dbo.BookReservation.isdeleted IS NULL) OR (dbo.BookReservation.deleted = 0)">
</asp:SqlDataSource>
</FooterTemplate>
<Fields>
<asp:BoundField DataField="bookid" HeaderText="ISBN" ReadOnly="True"
SortExpression="bookid" />
<asp:BoundField DataField="booktitle" HeaderText="Title"
SortExpression="booktitle" />
<asp:BoundField DataField="lastname" HeaderText="Author"
SortExpression="lastname" />
<asp:BoundField DataField="firstname" HeaderText=""
SortExpression="firstname" />
<asp:BoundField DataField="description" HeaderText="Description"
SortExpression="description" />
<asp:BoundField DataField="name" HeaderText="Category"
SortExpression="name" />
<asp:BoundField DataField="quantity" HeaderText="Quantity"
SortExpression="quantity" />
<asp:BoundField DataField="dateadded" HeaderText="Date added"
SortExpression="dateadded" />
<asp:CheckBoxField DataField="isdeleted" HeaderText="Deleted"
SortExpression="isdeleted" />
</Fields>
</asp:DetailsView>
<asp:SqlDataSource ID="bookdetailsDataSource" runat="server"
ConnectionString="<%$ ConnectionStrings:LibrarySystemConnectionString %>"
SelectCommand="SELECT dbo.TblBooks.bookid, dbo.TblBooks.booktitle, dbo.TblBooks.lastname, dbo.TblBooks.firstname, dbo.TblBooks.description, dbo.TblBooks.categoryid, dbo.TblBooks.dateadded, dbo.TblBooks.statusid, dbo.TblBooks.quantity, dbo.TblBooks.isdeleted, dbo.BookStatus.statusname, dbo.TblCategory.name, dbo.LendTable.EmployeeID, dbo.LendTable.dateborrowed, dbo.LendTable.expdateofreturn, dbo.LendTable.datereturned FROM dbo.TblBooks INNER JOIN dbo.TblCategory ON dbo.TblBooks.categoryid = dbo.TblCategory.categoryid INNER JOIN dbo.BookStatus ON dbo.TblBooks.statusid = dbo.BookStatus.statusid INNER JOIN dbo.LendTable ON dbo.TblBooks.bookid = dbo.LendTable.bookid WHERE (dbo.TblBooks.bookid = @bookid) ">
<SelectParameters>
<asp:ControlParameter ControlID="DropDownList2" Name="bookid"
PropertyName="SelectedValue" Type="Int64" />
</SelectParameters>
</asp:SqlDataSource>
</p>
<p>
<asp:FormView ID="FormView1" runat="server" DataKeyNames="reservationid"
DataSourceID="reserveDataSource" DefaultMode="Insert"
OnDataBound="FormView1_DataBound" >
<EditItemTemplate>
reservationid:
<asp:Label ID="reservationidLabel1" runat="server"
Text='<%# Eval("reservationid") %>' />
<br />
bookid:
<asp:TextBox ID="bookidTextBox" runat="server" Text='<%# Bind("bookid") %>' />
<br />
EmployeeID:
<asp:TextBox ID="EmployeeIDTextBox" runat="server"
Text='<%# Bind("EmployeeID") %>' />
<br />
reservedate:
<asp:TextBox ID="reservedateTextBox" runat="server"
Text='<%# Bind("reservedate") %>' />
<br />
<asp:LinkButton ID="UpdateButton" runat="server" CausesValidation="True"
CommandName="Update" Text="Update" />
amp;nbsp;<asp:LinkButton ID="UpdateCancelButton" runat="server"
CausesValidation="False" CommandName="Cancel" Text="Cancel" />
</EditItemTemplate>
<InsertItemTemplate>
Reserve date:
<asp:TextBox ID="reservedateTextBox" runat="server"
Text='<%# Bind("reservedate") %>' />
<a href="#" onclick="cdp1.showCalendar(this, 'ctl00$ContentPlaceHolder1$FormView1$reservedateTextBox'); return false;">Date Picker</a>
<asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ControlToValidate="reservedateTextBox" ErrorMessage="* " ValidationGroup="reservebook">
</asp:RequiredFieldValidator>
<br />
<asp:Button ID="InsertButton" runat="server" CausesValidation="True"
CommandName="Insert" Text="Insert" />
amp;nbsp;<asp:Button ID="InsertCancelButton" runat="server"
CausesValidation="False" CommandName="Cancel" Text="Cancel" />
<%--ISBN:--%>
<asp:TextBox ID="bookidTextBox" runat="server" Visible="false"
Text='<%# Bind("bookid") %>' />
<br />
<%--Employee PIN:--%>
<asp:TextBox ID="EmployeeIDTextBox" runat="server" Visible="false"
Text='<%# Bind("EmployeeID") %>' />
<br />
</InsertItemTemplate>
Ответ №1:
1) Установите fromView Visible="False"
изначально, из разметки. 2) присвоите OnSelectedIndexChanged="DropDownList2_SelectedIndexChanged"
выпадающему списку2 и установите его AutoPostBack="True"
3) в коде, лежащем в основе, добавьте это:
protected void DropDownList2_SelectedIndexChanged(object sender, EventArgs e)
{
if(!DropDownList2.SelectedValue.Equals("-1"))
FromView1.Visible=true;
else
FromView1.Visible=false;
}
Комментарии:
1. Выбранное значение не выбрано по индексу?
2. Лучше используйте SelectedValues, потому что индекс может измениться, и вы можете получить что-то другое вместо вашего элемента 0. но независимо от того, где в списке находится элемент «— Choose a book —«, он всегда будет иметь значение «-1», и вы всегда захотите скрыть свой FormView, если этот элемент выбран, независимо от индекса. Никогда не предполагайте, что оно всегда будет оставаться в позиции 0, никогда ничего не предполагайте в программировании 🙂
3. Спасибо, это сработало! Если я могу спросить еще раз, как я могу сделать так, чтобы formview не отображался при выборе первого выпадающего списка — Выберите категорию -? Я допустил ошибку, предполагалось, что formview будет отображаться, когда пользователь уже выбрал категорию. Тем временем я пытаюсь его изменить.