Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Gridview绑定意外清除_C#_Asp.net_Data Binding_Gridview - Fatal编程技术网

C# 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

我的gridview有问题。我已经寻找了很多解决方案,但找不到任何答案。我想我已经找到了问题所在,当我按下更新按钮时,gridview不再被绑定,这将导致空值。我认为这就足够约束我了。我还可以在哪里绑定gridview

请参见下面的标记:

    <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());
    }
}