我有一个ASP页面,其中包含一个绑定到选择查询和gridview的DDL。在pageLoad
之后,我可以选择一个值并填充gridview而不会出现任何问题。
<asp:DropDownList ID="DropDownList3" runat="server" OnSelectedIndexChanged="DropDownList3_SelectedIndexChanged" AutoPostBack="True">
<asp:ListItem>Select an entry</asp:ListItem>
<asp:ListItem>Requested</asp:ListItem>
<asp:ListItem>Requested and Closed</asp:ListItem>
<asp:ListItem>Ordered</asp:ListItem>
<asp:ListItem>Working</asp:ListItem>
<asp:ListItem>Warranty Parts</asp:ListItem>
<asp:ListItem>Warranty Service</asp:ListItem>
<asp:ListItem>Filled</asp:ListItem>
</asp:DropDownList>
protected void DropDownList3_SelectedIndexChanged(object sender, EventArgs e)
{
//string choice = DropDownList3.SelectedItem.Text;
int index = DropDownList3.SelectedIndex;
string query;
switch (index)
{
case 0:
{
query = "SELECT TOP 100 [last_name], [zpart_used_manual], [zpart_used_SN], [serial_number], [ref_num], [status], [summary], [id], [zpart_used_completed] FROM [VIEW_USS_ICG_Parts_Requested] ORDER BY [last_name]";
break;
}
case 1:
{
query = "SELECT TOP 100 [last_name], [zpart_used_manual], [zpart_used_SN], [serial_number], [ref_num], [status], [summary], [id], [zpart_used_completed] FROM [VIEW_USS_ICG_Parts_Requested] WHERE [status]='WAIT-PR' ORDER BY [last_name]";
break;
}
case 2:
{
query = "SELECT [last_name], [zpart_used_manual], [zpart_used_SN], [serial_number], [ref_num], [status], [summary], [id], [zpart_used_completed] FROM [VIEW_USS_ICG_Parts_Requested] WHERE ([zpart_used_completed] IS NULL) AND ([status]='WAIT-PR' OR [status]='CLO') ORDER BY [last_name]";
break;
}
case 3:
{
query = "SELECT TOP 100 [last_name], [zpart_used_manual], [zpart_used_SN], [serial_number], [ref_num], [status], [summary], [id], [zpart_used_completed] FROM [VIEW_USS_ICG_Parts_Requested] WHERE [status]='WAIT-PO' ORDER BY [last_name]";
break;
}
case 4:
{
query = "SELECT TOP 100 [last_name], [zpart_used_manual], [zpart_used_SN], [serial_number], [ref_num], [status], [summary], [id], [zpart_used_completed] FROM [VIEW_USS_ICG_Parts_Requested] WHERE [status]='WORK' ORDER BY [last_name]";
break;
}
case 5:
{
query = "SELECT TOP 100 [last_name], [zpart_used_manual], [zpart_used_SN], [serial_number], [ref_num], [status], [summary], [id], [zpart_used_completed] FROM [VIEW_USS_ICG_Parts_Requested] WHERE [status]='WAIT - WP' OR [status]='WAIT-W' ORDER BY [last_name]";
break;
}
case 6:
{
query = "SELECT [last_name], [zpart_used_manual], [zpart_used_SN], [serial_number] , [ref_num], [status], [summary], [id], (SELECT [DDvalue] FROM zpartStatuses WHERE [code] = [zpart_used_completed] ) AS [zpart_used_completed] FROM View_USS_ICG_Parts_Requested INNER JOIN zpartStatuses ON [zpart_used_completed] = zpartStatuses.code WHERE ([status] = 'WAIT - WS')ORDER BY [last_name]";
break;
}
case 7:
{
query = "SELECT [last_name], [zpart_used_manual], [zpart_used_SN], [serial_number], [ref_num], [status], [summary], [id], [zpart_used_completed] FROM [VIEW_USS_ICG_Parts_Requested] WHERE [zpart_used_completed] = '1' ORDER BY [last_name]";
//query = "SELECT TOP 100 [last_name], [zpart_used_manual], [zpart_used_SN], [serial_number], [ref_num], [status], [summary], [id], [zpart_used_completed] FROM [VIEW_USS_ICG_Parts_Requested] ORDER BY [last_name]";
break;
}
default:
{
query = "SELECT TOP 100 [last_name], [zpart_used_manual], [zpart_used_SN], [serial_number], [ref_num], [status], [summary], [id], [zpart_used_completed] FROM [VIEW_USS_ICG_Parts_Requested] ORDER BY [last_name]";
break;
}
}
SqlConnection sqlConnection = new SqlConnection(@"Data Source=XXX.XXX.XXX.XXX;Initial Catalog=mdb;Persist Security Info=True;User ID=user;Password=pass");
SqlCommand sqlCommand = new SqlCommand(query, sqlConnection);
sqlConnection.Open();
SqlDataReader reader = sqlCommand.ExecuteReader();
GridView1.DataSource = reader;
GridView1.DataBind();
}
在gridview中,我有一个包含另一个DDL的项模板,该模板会触发该行的更新查询。
<asp:DropDownList ID="DropDownList4" runat="server" DataSourceID="SqlDataSource1"
DataTextField="DDvalue" DataValueField="code" Height="20px" Width="150px"
AutoPostBack="True" CommandName="DD4" OnSelectedIndexChanged = "DDL4_SelectedIndexChanged">
</asp:DropDownList>
protected void DDL4_SelectedIndexChanged(object sender, EventArgs e)
{
string sqlQueryString2 = "UPDATE [act_log] SET [zpart_used_completed]= @status, [zpart_used_status] = @date WHERE [id] = @id";
SqlConnection sqlConnectionCmdString2 = new SqlConnection(@"Data Source=XXX.XXX.XXX.XXX;Initial Catalog=mdb;Persist Security Info=True;User ID=user;Password=pass");
int status;
GridViewRow gr = (GridViewRow)((DataControlFieldCell)((DropDownList)sender).Parent).Parent;
DropDownList d4 = (DropDownList)gr.FindControl("DropDownList4");
status = d4.SelectedIndex;
string id = GridView1.Rows[gr.RowIndex].Cells[10].Text;
sqlConnectionCmdString2.Open();
SqlCommand sqlQueryCmd2 = new SqlCommand(sqlQueryString2, sqlConnectionCmdString2);
sqlQueryCmd2.Parameters.Add("@id", id);
sqlQueryCmd2.Parameters.Add("@status", status);
sqlQueryCmd2.Parameters.Add("@date", DateTime.Now.ToShortDateString());
sqlQueryCmd2.ExecuteNonQuery();
sqlQueryCmd2.Dispose();
sqlConnectionCmdString2.Close();
GridView1.DataBind();
}
两个DDL都设置为AutoPostBack。问题是当OnSelectedIndexChanged
事件从DropDownList4
触发时,它不会使页面返回DropDownList3
的结果。页面取而代之的是:
<EmptyDataTemplate>
No records could be retrieved from the database. We apologize for the invonvenience.
</EmptyDataTemplate>
如何在每次修改时让页面刷新gridview?
答案 0 :(得分:0)
AutoPostBack
属性导致回发(显然)。从this.Databind();
删除!IsPostBack
。
if (!IsPostBack) {
this.DataBind();
}
变为:
this.DataBind();
<强>更新强>
您是否在GridView上启用了ViewState?
<强>更新强>
好的,我认为现在可以看到问题。在DropDownList3_SelectedIndexChanged
的处理程序中,您为DataSource
设置了GridView1
:
GridView1.DataSource = reader;
GridView1.DataBind();
然后,在DDL4_SelectedIndexChanged
回发处理程序中,您尝试重新绑定GridView1
而不指定其他数据源。
GridView1.DataBind();
如果GridView1
以声明方式设置DataSource
(在ASPX标记中),则这不是问题。但是,根据我的经验,DataSource
属性在动态设置(在代码隐藏中)时永远不会自动保留。
解决方案是重新运行Select
查询并在重新绑定之前重新设置数据源,或者手动保留数据源,然后您可以随意重新绑定。
要手动持久化数据源,我通常使用我存储在ViewState中的受保护页面属性。
protected SqlDataReader GridView1DataSource {
get {
SqlDataReader reader = null;
if (ViewState("SomeStringUniqueToThePageThatICanUseAsAKeyAndRemainsDescriptive") != null) {
reader = ViewState("SomeStringUniqueToThePageThatICanUseAsAKeyAndRemainsDescriptive");
}
return reader;
}
set { ViewState("SomeStringUniqueToThePageThatICanUseAsAKeyAndRemainsDescriptive") = value; }
}
然后
设置页面属性
this.GridView1DataSource = reader;
将数据源设置为页面属性
GridView1.DataSource = this.GridView1DataSource;
重新绑定
GridView1.DataBind();
没有理由不能同时使用这两种技术,但如果您需要数据源进行实际更新,则需要重新运行查询,然后再将其保存在页面属性中。
另一方面,如果您不需要数据源来实际更新,您甚至可能不需要重新绑定GridView
回发处理程序中的DDL4_SelectedIndexChanged
数据源。