Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.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# ASP.NET数据网格为空_C#_Asp.net_Data Binding_Datagrid - Fatal编程技术网

C# ASP.NET数据网格为空

C# ASP.NET数据网格为空,c#,asp.net,data-binding,datagrid,C#,Asp.net,Data Binding,Datagrid,我有一个ASP.NET datagrid,它位于用户控件上。我有一个主页,它添加了用户控件,有时还添加了用户控件的多个副本,并在回发时恢复这些副本 dataGrid具有插入/编辑/删除链接。我可以将用户控件的多个副本添加到页面中,插入/编辑/删除功能对于每个单独的控件都非常有效 昨天,我使用Text=格式向主页添加了一些与用户控件无关的属性绑定。最初,在添加Page.DataBind之前,我无法实现此功能;转到主页的页面加载方法。此时,属性绑定开始正常工作,但随后我注意到每个用户控件内的数据网格

我有一个ASP.NET datagrid,它位于用户控件上。我有一个主页,它添加了用户控件,有时还添加了用户控件的多个副本,并在回发时恢复这些副本

dataGrid具有插入/编辑/删除链接。我可以将用户控件的多个副本添加到页面中,插入/编辑/删除功能对于每个单独的控件都非常有效

昨天,我使用Text=格式向主页添加了一些与用户控件无关的属性绑定。最初,在添加Page.DataBind之前,我无法实现此功能;转到主页的页面加载方法。此时,属性绑定开始正常工作,但随后我注意到每个用户控件内的数据网格中的插入功能已停止工作……我调试并发现,当执行以下行时,它会发现数据网格内控件中的文本字段为空或:

eInfo.Ref = ((TextBox)gvEG.FooterRow.FindControl("txtEmployeeName")).Text;
如果我从主页中删除page.DataBind方法,那么属性绑定将停止工作,但userControl中的数据网格将开始工作

我的问题有两个:一是为什么看似无关的变化会影响dataGrid;二是我该怎么做才能让它正常工作

我在下面添加了代码的相关部分……或者至少我认为是相关部分

Default.aspx

    <div class="general">        
    <asp:TextBox Width="488" runat="server" placeholder="Document Title"  Text='<%# DocumentTitle %>'></asp:TextBox>
    </div>
EmployeeSectionUserControl.ascx

<asp:GridView ID="gvEG" runat="server" AutoGenerateColumns="False" CssClass="grid"
AlternatingRowStyle-CssClass="gridAltRow" RowStyle-CssClass="gridRow" ShowFooter="True"
EditRowStyle-CssClass="gridEditRow" FooterStyle-CssClass="gridFooterRow" OnRowCancelingEdit="gvEG_RowCancelingEdit"
OnRowCommand="gvEG_RowCommand" OnRowDataBound="gvEG_RowDataBound" OnRowDeleting="gvEG_RowDeleting"
OnRowEditing="gvEG_RowEditing" OnRowUpdating="gvEG_RowUpdating" DataKeyNames="Id" ShowHeaderWhenEmpty="true">
<Columns>
    <asp:TemplateField HeaderText="Id" HeaderStyle-HorizontalAlign="Left" ControlStyle-Width="50px">
        <ItemTemplate>
            <%# Eval("Id")%>
        </ItemTemplate>
    </asp:TemplateField>

    <asp:TemplateField HeaderText="Ref" HeaderStyle-HorizontalAlign="Left" ControlStyle-Width="90px">
        <EditItemTemplate>
            <asp:TextBox ID="txtEmployeeName" runat="server" Text='<%# Bind("Ref") %>'
                Width="90px"></asp:TextBox>                
        </EditItemTemplate>
        <FooterTemplate>
            <asp:TextBox ID="txtEmployeeName" runat="server" Width="90px"></asp:TextBox>                
        </FooterTemplate>

Page.DataBind对其子项调用DataBind,因此它会更新文本框中的DocumentTitle,但也会对网格进行数据绑定。我没有在您的网格中看到数据源集,比如EntityDataSource,因此我假设您自己在代码中智能地检索和准备数据,并自己设置数据源:

gvEg.DataSource = someCollection;
gvEg.DataBind();
在获取时,您正在加载用户控件,并可能通过指定数据源调用此数据绑定。它绑定,然后调用Page.DataBind,这可能也会触发gvEg的另一个数据绑定,但由于设置了DataSource,所以显示的是相同的

在邮件背面,您不应该在处理事件之前进行数据绑定。您对Page.DataBind的调用就是这样做的。它触发一个没有数据源的数据绑定。然后row命令来检查页脚中的文本框,该文本框由于没有元素的数据绑定而被清除

你应该做的是: 您不应该使用Page.DataBind。如果您这样做了,那么您需要在所有数据源都正确设置的时刻进行操作,并且在回发期间不应该将其踢出。一般来说,我不建议使用它,因为它会使它变得更复杂,如果您没有正确设置应用程序,它可能只会有一点帮助。 对你来说,这绝对不是必要的。您的文本框是一个服务器控件,它不是任何绑定GridView、Repeater和ListView的一部分。因此,您的文本框在代码隐藏中立即可用。 所以你应该:

为文本框提供一个可以使用的ID,如txtDocumentTitle

 <asp:TextBox Width="488" ID="txtDocumentTitle" runat="server" placeholder="Document Title"></asp:TextBox>
删除Page.DataBind


因此,您可以立即访问服务器控件,因为它们也是页面或控件中的属性。

Hi Dacker…感谢您的完整回答。这解释了为什么我看到了我看到的行为。我发现你的答案是有效的,但我也可以在不破坏dataGrid的情况下调用单个控件上的dataBind使其绑定工作,但我认为我更喜欢你的方法,因为它可以避免任何可能的混淆。很高兴我能帮上忙并解释!
gvEg.DataSource = someCollection;
gvEg.DataBind();
 <asp:TextBox Width="488" ID="txtDocumentTitle" runat="server" placeholder="Document Title"></asp:TextBox>
 txtDocumentTitle.Text = "I am the default document title and I'm bound.";