GridView的DropDownList筛选器不起作用
本文关键字:不起作用 筛选 DropDownList GridView | 更新日期: 2023-09-27 18:27:39
在我正在开发的基于web的应用程序中,我有两个GridView。第一个GridView上方有一个DropDownList,用于根据用户的划分筛选建议。在将第二个GridView放入UpdatePanel控件后,这个DropDownList就不再工作了,我不知道为什么,也不知道这和这个之间有什么关系。知道吗?
在UpdatePanel控件中添加第二个GridView之前,一切都很好,,但现在用于过滤第一个GridView中的建议的过滤器不起作用。知道吗?请帮忙吗
我的ASP.NET代码:
<strong> Division </strong>
<asp:DropDownList ID="ddlDivision" runat="server" AppendDataBoundItems="True"
AutoPostBack="True" DataSourceID="sqlDataSourceDivision"
DataTextField="DivisionShortcut" DataValueField="DivisionShortcut"
Width="175px" EnableViewState="False">
<asp:ListItem Value="%">All</asp:ListItem>
</asp:DropDownList>
<br /> <br />
<asp:GridView ID="GridView1" runat="server" AllowPaging="True"
AllowSorting="True" AutoGenerateColumns="False"
DataKeyNames="ID"
width="950px" CssClass="mGrid"
AlternatingRowStyle-CssClass="alt"
RowStyle-HorizontalAlign="Center"
DataSourceID="SqlDataSource1"
OnRowDataBound="GridView1_RowDataBound" >
<AlternatingRowStyle BackColor="White" ForeColor="#284775" />
<HeaderStyle Font-Bold = "true" ForeColor="Black" Height="20px"/>
<Columns>
<asp:BoundField DataField="ID" HeaderText="ID" InsertVisible="False" ReadOnly="True" SortExpression="ID" />
<asp:BoundField DataField="Title" HeaderText="Title" SortExpression="Title" />
<asp:BoundField DataField="Description" HeaderText="Description" SortExpression="Description" />
<asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" />
<asp:BoundField DataField="Username" HeaderText="Username" SortExpression="Username" />
<asp:BoundField DataField="DivisionShortcut" HeaderText="Division" SortExpression="DivisionShortcut" />
<asp:TemplateField HeaderText="Status">
<ItemTemplate>
<asp:DropDownList ID="DropDownList" runat="server"
DataSourceID="SqlDataSource2"
Font-Bold="True" ForeColor="#006666"
AppendDataBoundItems="false"
DataTextField="Status" DataValueField="ID"
AutoPostBack="true"
OnDataBound="DropDownList_DataBound"
OnSelectedIndexChanged ="DropDownList_SelectedIndexChanged">
</asp:DropDownList>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
<asp:SqlDataSource ID="SqlDataSource1" runat="server"
ConnectionString="<%$ ConnectionStrings:testConnectionString %>"
SelectCommand="SELECT dbo.SafetySuggestionsLog.ID, dbo.SafetySuggestionsLog.Title, dbo.SafetySuggestionsLog.Description, dbo.employee.Name, dbo.SafetySuggestionsLog.Username, dbo.Divisions.DivisionShortcut FROM dbo.employee INNER JOINdbo.SafetySuggestionsLog ON dbo.employee.Username = dbo.SafetySuggestionsLog.Username INNER JOIN dbo.Divisions ON dbo.employee.DivisionCode = dbo.Divisions.SapCode"
FilterExpression="[DivisionShortcut] like '{0}%'">
<FilterParameters>
<asp:ControlParameter ControlID="ddlDivision"
Name="DivisionShortcut" PropertyName="SelectedValue"
Type="String" />
</FilterParameters>
</asp:SqlDataSource>
<%--For the DropDownList--%>
<asp:SqlDataSource ID="SqlDataSource2" runat="server"
ConnectionString="<%$ ConnectionStrings:testConnectionString %>"
SelectCommand="SELECT * FROM [SafetySuggestionsStatus]">
</asp:SqlDataSource>
<%--Filtering by Division--%>
<asp:SqlDataSource ID="sqlDataSourceDivision" runat="server"
ConnectionString="<%$ ConnectionStrings:testConnectionString %>"
SelectCommand="SELECT [DivisionShortcut] FROM [Divisions]"></asp:SqlDataSource>
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<Triggers>
<asp:AsyncPostBackTrigger ControlID="ddlDivision"
EventName="SelectedIndexChanged" />
</Triggers>
<ContentTemplate>
<br />
<p><h3><b><u>PMOD Divisions' Safety Suggestions List</u></b></h3>
<p></p><br />
<asp:Panel ID="Panel1" runat="server">
<asp:GridView ID="GridView2" runat="server" AllowSorting="True" AlternatingRowStyle-CssClass="alt" AutoGenerateColumns="False" CssClass="mGrid" RowStyle-HorizontalAlign="Center"
DataSourceID="SqlDataSource4" >
<AlternatingRowStyle BackColor="White" ForeColor="#284775" />
<HeaderStyle Font-Bold="true" ForeColor="Black" Height="20px" />
<Columns>
<asp:BoundField DataField="SubmittedMonth" HeaderText="Month Submitted" ReadOnly="True" SortExpression="SubmittedMonth" />
<asp:BoundField DataField="DivisionShortcut" HeaderText="Division" SortExpression="DivisionShortcut" />
<asp:BoundField DataField="Username" HeaderText="NetworkID" SortExpression="Username" />
<asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" />
<asp:BoundField DataField="Title" HeaderText="Title" SortExpression="Title" />
<asp:BoundField DataField="Description" HeaderText="Description" SortExpression="Description" />
<asp:BoundField DataField="Type" HeaderText="Type" SortExpression="Type" />
<asp:BoundField DataField="Status" HeaderText="Status" SortExpression="Status" />
</Columns>
<RowStyle HorizontalAlign="Center" />
</asp:GridView>
</asp:Panel>
<asp:SqlDataSource ID="SqlDataSource4" runat="server"
ConnectionString="<%$ ConnectionStrings:testConnectionString %>" SelectCommand="SELECT TOP (100) PERCENT LEFT(DATENAME(month, dbo.SafetySuggestionsLog.DateSubmitted), 3) + '-' + DATENAME(year, dbo.SafetySuggestionsLog.DateSubmitted) AS SubmittedMonth, dbo.Divisions.DivisionShortcut, dbo.SafetySuggestionsLog.Username, dbo.employee.Name, dbo.SafetySuggestionsLog.Title, dbo.SafetySuggestionsLog.Description, dbo.SafetySuggestionsType.Type, dbo.SafetySuggestionsStatus.Status FROM dbo.Divisions INNER JOIN dbo.employee ON dbo.Divisions.SapCode = dbo.employee.DivisionCode INNER JOIN dbo.SafetySuggestionsLog ON dbo.employee.Username = dbo.SafetySuggestionsLog.Username INNER JOIN dbo.SafetySuggestionsType ON dbo.SafetySuggestionsLog.TypeID = dbo.SafetySuggestionsType.ID INNER JOIN dbo.SafetySuggestionsStatus ON dbo.SafetySuggestionsLog.StatusID = dbo.SafetySuggestionsStatus.ID WHERE (DATEDIFF(month, dbo.SafetySuggestionsLog.DateSubmitted, GETDATE()) < 3) ORDER BY dbo.SafetySuggestionsLog.DateSubmitted DESC">
</asp:SqlDataSource>
<asp:Button ID="btnPrint" runat="server" OnClick="btnPrint_Click" Text="Print" />
<p></p></p>
</ContentTemplate>
</asp:UpdatePanel>
代码背后:
protected void btnPrint_Click(object sender, EventArgs e)
{
Session["ctrl"] = Panel1;
ScriptManager.RegisterStartupScript(GridView2, GridView2.GetType(), "onclick", "window.open('Print.aspx','PrintMe','height=400px,width=800px,scrollbars=1');", true);
}
int i = 1;
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
e.Row.Cells[0].Text = i.ToString();
i++;
}
}
protected void DropDownList_DataBound(object sender, EventArgs e)
{
if (!IsPostBack)
((DropDownList)sender).Items.Insert(0, new ListItem("--Select--", ""));
}
protected void DropDownList_SelectedIndexChanged(object sender, EventArgs e)
{
DropDownList ddl = (DropDownList)sender;
int suggestionStatus = int.Parse(ddl.SelectedValue);
GridViewRow row = (GridViewRow)ddl.NamingContainer;
string strID = GridView1.DataKeys[row.RowIndex]["ID"].ToString();
int ID = Int32.Parse(strID);
//For inserting the status in the database
string connString = "Data Source=localhost''sqlexpress;Initial Catalog=psspdbTest;Integrated Security=True";
string updateCommand = "UPDATE SafetySuggestionsLog SET [StatusID] = @StatusID WHERE [ID] = @ID";
using (SqlConnection conn = new SqlConnection(connString))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand(updateCommand, conn))
{
cmd.Parameters.Clear();
cmd.Parameters.AddWithValue("@StatusID", suggestionStatus);
cmd.Parameters.AddWithValue("@ID", ID);
cmd.ExecuteNonQuery();
}
conn.Close();
}
GridView2.DataBind();
}
为什么不尝试将DropDownList放在更新面板中,并将回发触发器添加到DropDown列表中(也包括)
要填充的网格视图应该在更新面板中
您还应该考虑更新面板中的UpdateMode
,因为它是Always by default
您可能缺少DropDownList handler
中gridview 1
的绑定
我认为发生的事情是,一旦您将ddlDivision设置为UpdatePanel的触发器,它将不再进行正常的回发。相反,它将导致UpdatePanel部分回发过程。由于您的Gridview1未包含在UpdatePanel的ContentTemplate
中,因此回发后将不再更新它。这就是UpdatePanel的工作方式——它们只返回对其中项目的更改,而不返回页面上的其他项目。
在将下拉列表作为触发器放入UdpatePanel之前,ddlDivision上的AutoPostback设置会导致整个页面被刷新,并且您的网格视图会被过滤,因为您的数据源使用ddl作为参数。
首先,您添加了ScriptManager吗?
无论如何,通过查看您的代码,我可以看到您为ddlDivision添加了AsyncPostBackTrigger,但您尚未为ddlDivision创建SelectedIndexChanged事件,请尝试以下操作:
<asp:DropDownList ID="ddlDivision" runat="server" AppendDataBoundItems="True"
AutoPostBack="True" DataSourceID="sqlDataSourceDivision" DataTextField="DivisionShortcut"
DataValueField="DivisionShortcut" Width="175px" EnableViewState="False"
OnSelectedIndexChanged="ddlDivision_SelectedIndexChanged">
<asp:ListItem Value="%">All</asp:ListItem>
</asp:DropDownList>
当然,然后添加代码来处理事件。