C# Gridview绑定意外清除
我的gridview有问题。我已经寻找了很多解决方案,但找不到任何答案。我想我已经找到了问题所在,当我按下更新按钮时,gridview不再被绑定,这将导致空值。我认为这就足够约束我了。我还可以在哪里绑定gridview 请参见下面的标记:C# Gridview绑定意外清除,c#,asp.net,data-binding,gridview,C#,Asp.net,Data Binding,Gridview,我的gridview有问题。我已经寻找了很多解决方案,但找不到任何答案。我想我已经找到了问题所在,当我按下更新按钮时,gridview不再被绑定,这将导致空值。我认为这就足够约束我了。我还可以在哪里绑定gridview 请参见下面的标记: <asp:GridView ID="ProductGridView" runat="server" AllowPaging="True" AllowSorting="True" AutoGenerateColumns="False" Da
<asp:GridView ID="ProductGridView" runat="server" AllowPaging="True" AllowSorting="True"
AutoGenerateColumns="False" DataKeyNames="Id" OnRowEditing="ProductGridView_RowEditing"
OnRowCancelingEdit="ProductGridView_RowCancelingEdit" OnRowUpdating="ProductGridView_RowUpdating"
OnRowDeleting="ProductGridView_RowDeleting" OnDataBound="ProductGridView_DataBound" OnRowDataBound="ProductGridView_RowDataBound">
<Columns>
<asp:CommandField ShowDeleteButton="True" ShowEditButton="True" CausesValidation="false" />
<asp:TemplateField HeaderText="Name" SortExpression="Name">
<EditItemTemplate>
<asp:TextBox ID="txtName" runat="server" Text='<%# Bind("Name") %>'></asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="lblName" runat="server" Text='<%# Eval("Name") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Quantity" SortExpression="Quantity">
<EditItemTemplate>
<asp:TextBox ID="txtQuantity" runat="server" Text='<%# Bind("Quantity") %>'></asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="lblQuantity" runat="server" Text='<%# Eval("Quantity") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Family" SortExpression="Family.Name">
<EditItemTemplate>
<asp:DropDownList ID="ddlFamily" runat="server" OnInit="ddlFamily_Init">
</asp:DropDownList>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="lblFamily" runat="server" Text='<%# Eval("Family.Name") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
如果我理解正确的话,您是说datagrid中的表单控件在回发后消失或重置为初始状态 发生这种情况的原因是您正在使用Page_Load方法绑定网格,这在页面生命周期中来得太晚,无法恢复控件值。只有在LoadViewstate和LoadPostbackData事件触发后,网格才会加载,因此,每次进行回发时,网格的控件都会以其原始状态加载 我猜您对asp.net生命周期很熟悉,但如果不是,这里有一篇文章:。我已经多次处理过这个问题,我花了一段时间才完全理解这里发生了什么 该问题的一个解决方案是在覆盖的OnInit方法中加载网格,该方法在恢复控制数据之前发生。像这样的方法应该会奏效:
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
BindGridView(_productRepo.GetAll());
}
我通常这样做数据绑定。。。。尝试此函数,并在页面加载和其他需要的函数中调用它
protected void bind()
{
con.Open();
SqlCommand cmd = new SqlCommand("Your Query", con);
DataSet ds = new DataSet();
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = cmd;
da.Fill(ds);
gvCourse.DataSource = ds;
gvCourse.DataBind();
con.Close();
}
或者,你可以简单地更换!Page.IsPostBack with!IsPostBack
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
BindGridView(_productRepo.GetAll());
}
}
这很有帮助。行计数现在是正确的值。但是,找不到我的控件。您有什么想法吗?看起来您正在使用FindChildControl方法,该方法正在查看整个页面中具有给定ID的控件。在GridView中查找控件时,需要像在ProductGridView_RowDataBound中那样调用“e.Row.FindControl(controlName)”。我还尝试了
TextBox txtName=(ProductGridView.Rows[e.RowIndex].FindControl(“txtName”)作为TextBox)代码>没有结果。它也返回null。我已经找到了问题所在。当我单步执行FindChildControl方法时,它将只查找标签。因此,我认为当单击更新按钮时,EditItemTemplates中的文本框会在我有机会在gridview中搜索之前返回到ItemTemplates。我还没有找到解决方案。我刚刚测试了您的代码,并能够通过使用TextBox txtName=(TextBox)ProductGridView.Rows[e.RowIndex].FindControl(“txtName”);在行更新方法中。您不应该将FindChildControl方法与gridview一起使用,因为每行都有一个附加到控件id的索引。例如,第一行id的文本框是“ProductGridView\u txtName\u 0”。只有使用GridViewRow的FindControl才能获得正确的对象。谢谢您的回答。然而,绑定本身的代码并不是问题所在。我需要帮助的是调用绑定的方式和时间。您应该在对网格进行更改(如编辑、更新和插入)时调用绑定函数,如果需要,也可以在页面加载中调用绑定函数。您可以像调用任何其他函数一样调用绑定函数,因此,在程序中,您应该在行编辑函数、行更新和页面加载的末尾调用绑定函数。希望这对您有所帮助:-)
protected void bind()
{
con.Open();
SqlCommand cmd = new SqlCommand("Your Query", con);
DataSet ds = new DataSet();
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = cmd;
da.Fill(ds);
gvCourse.DataSource = ds;
gvCourse.DataBind();
con.Close();
}
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
BindGridView(_productRepo.GetAll());
}
}