我有一个GridView,它具有以下属性:
OnRowUpdating="GridViewRowUpdateEventHandler"
在GridView中,我有以下控件:
<asp:TemplateField HeaderText="Progress" SortExpression="progress">
<ItemTemplate>
<asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="true">
<asp:ListItem Value="0">Incomplete</asp:ListItem>
<asp:ListItem Value="1">Complete</asp:ListItem>
</asp:DropDownList>
</ItemTemplate>
</asp:TemplateField>
GridViewRowUpdateEventHandler
看起来像这样:
protected void GridViewRowUpdateEventHandler(object sender, GridViewUpdateEventArgs e)
{
SqlConnection connection;
SqlCommand command;
GridViewRow row = (GridViewRow)GridView1.Rows[e.RowIndex];
DropDownList ddlPriority = (DropDownList)row.FindControl("DropDownList1");
using (connection = new SqlConnection(ConfigurationManager.AppSettings["connString"]))
{
using (command = new SqlCommand(@"update table1 set priority = @priority where id = @id", connection))
{
command.Parameters.Add("@priority", SqlDbType.Int, 1).Value = ddlPriority.SelectedValue;
command.Parameters.Add("@id", SqlDbType.Int, 1).Value = row.RowIndex;
connection.Open();
command.ExecuteNonQuery();
connection.Close();
}
}
GridView1.DataBind();
}
我根本没有收到错误消息,并且数据库中的相关行没有更新。谁知道为什么?
可能是因为我正在查看错误的单元格Cells[5]
吗?或者也许是因为我在page_load中什么都没有?或者别的什么?
答案 0 :(得分:1)
由于DropDiownList位于TemplateField
且NamingContainer
是GridViewRow,因此您应该使用row.FindControl
来获取引用:
DropDownList ddlPriority = (DropDownList)row.FindControl("DropDownList1");
而不是
DropDownList ddlPriority = (DropDownList)row.Cells[5].FindControl("DropDownList1");
但这不是问题的核心,因为row.Cells[5].FindControl
在第6个单元格中也可能起作用。否则你会得到NullreferenceException
。
我假设您还在回发上绑定了GridView,您应该检查IsPostBack
属性:
protected void Page_Load()
{
if (!IsPostBack)
{
BindGrid();
}
}
除此之外:
command.Parameters.Add("@id", SqlDbType.Int, 1).Value = row;
不起作用,因为row
是GridViewRow。你最后也应该DataBind
你的GridView,否则不会反映出这些变化。
答案 1 :(得分:1)
您在GridViewRowUpdateEventHandler的末尾添加DataBind
GridView.DataBind();
为了找到控制
var ddlPriority = (DropDownList)row.FindControl("DropDownList1");
答案 2 :(得分:1)
我认为您已忘记重新绑定 gridView数据
gridview1.DataSource = YOUR_DATASOURCE;
gridview1.DataBind();
此外,您应该通过
访问dropDownListDropDownList ddlPriority = (DropDownList) row.FindControl("DropDownList1");
修改强>
发现了另一个错误
command.Parameters.Add("@id", SqlDbType.Int, 1).Value = row; // wrong! primaryKey value needed!
这不起作用,因为行是GridViewRow类型。您应该指定我假设的primaryKey值!
无论您决定先做什么,我都会添加一些Debug.WriteLine(..)
语句,以查看将哪些值发送到SQL Server。
答案 3 :(得分:1)
我认为问题在于您使用行的rowIndex作为ID。所以你最后的sql命令就是这样的
update table1 set priority = 'blah' where id = 0 //(where its the first row and so on)
所以这是一个非常好的查询,它将运行没有错误或异常,但没有ID = 0.您将它绑定到错误的ID。你需要绑定它,是表中的ID。
您可以通过运行SQL事件探查器来仔细检查这一点,并且您应该能够找到发送到数据库的查询。