Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.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的TemplateFields中动态创建的控件获取数据_C#_Asp.net_.net - Fatal编程技术网

C# 从gridview的TemplateFields中动态创建的控件获取数据

C# 从gridview的TemplateFields中动态创建的控件获取数据,c#,asp.net,.net,C#,Asp.net,.net,我有一个网页,有一个gridview,它绑定到一个自定义对象列表,但也有一个动态创建的TemplateFields。这些字段是在Page_PreRender中创建的,可以是基于列表中对象的文本框或下拉列表。我在页面底部有一个按钮,按下时需要保存在动态对象中输入的所有数据。当我尝试查找动态控件时,我无法使用FindControl方法进行查找。它总是一片空白 如何检索用户输入/选择的数据 这是我的网格视图 <div id="divSearchCriteriaGrid" runat="serve

我有一个网页,有一个gridview,它绑定到一个自定义对象列表,但也有一个动态创建的TemplateFields。这些字段是在Page_PreRender中创建的,可以是基于列表中对象的文本框或下拉列表。我在页面底部有一个按钮,按下时需要保存在动态对象中输入的所有数据。当我尝试查找动态控件时,我无法使用FindControl方法进行查找。它总是一片空白

如何检索用户输入/选择的数据

这是我的网格视图

<div id="divSearchCriteriaGrid" runat="server" class="padding-top-15">
                    <asp:GridView ID="gvSearchCriteria" runat="server" AutoGenerateColumns="False" OnRowDataBound="gvSearchCriteria_OnRowDataBound" GridLines="None">
                        <Columns>
                            <asp:BoundField DataField="SearchFieldId" Visible="False" />
                            <asp:TemplateField HeaderText="Search Field">
                                <ItemTemplate>
                                    <asp:CheckBox ID="cbDisplay" runat="server" AutoPostBack="False" onclick="ToggleCriteriaControls(this)" />
                                </ItemTemplate>
                                <ItemStyle Width="25%" />
                            </asp:TemplateField>
                            <asp:TemplateField HeaderText="Begin Criteria">
                                <ItemStyle Width="35%" />
                            </asp:TemplateField>
                            <asp:TemplateField HeaderText="End Criteria">
                                <ItemStyle Width="35%" />
                            </asp:TemplateField>
                            <asp:BoundField DataField="ControlTypeId" Visible="False" />
                        </Columns>
                    </asp:GridView>
                </div>
这一切都很好,控件是通过复选框创建的。 下面是我的代码,用于尝试循环遍历gridview的每一行,以获取用户输入的无效数据

private void Save()
    {
       foreach (GridViewRow row in gvSearchCriteria.Rows)
       {
           CheckBox include = (CheckBox)row.FindControl("cbDisplay");
           int id, controlTypeId;
           string criteriaOne = string.Empty;
           string criteriaTwo = string.Empty;
           if (!include.Checked) continue;

           id = int.Parse(row.Cells[0].Text);
           if (controlTypeId == "1")
           {
               RadTextBox radTextBox = (RadTextBox) row.FindControl("txtBoxBegin");
               if (radTextBox != null)
               {
                   criteriaOne = radTextBox.Text;
               }

               radTextBox = (RadTextBox)row.FindControl("txtBoxEnd");
               if (radTextBox != null)
               {
                   criteriaTwo = radTextBox.Text;
               }

           }
           else if(controlTypeId == "2")
           {
               RadComboBox radComboBox = (RadComboBox)row.FindControl(string.Format("cbo{0}Begin",id));
               if (radComboBox != null)
               {
                   criteriaOne = radComboBox.SelectedValue;
               }
           }
       } 
    }
我试图使用FindControlId获取的radTextBox和radComboBox变量总是返回null。 单元格0每次都返回ok,Id正确。cbDisplay复选框始终返回该行是否被选中,而单元格4只获得ControlTypeId。我无法获取模板字段的值


非常感谢您的帮助。

一旦我将BindData函数移到Page_Init而不是Page_PreRender,我就能够从动态控件获取信息

private void Save()
    {
       foreach (GridViewRow row in gvSearchCriteria.Rows)
       {
           CheckBox include = (CheckBox)row.FindControl("cbDisplay");
           int id, controlTypeId;
           string criteriaOne = string.Empty;
           string criteriaTwo = string.Empty;
           if (!include.Checked) continue;

           id = int.Parse(row.Cells[0].Text);
           if (controlTypeId == "1")
           {
               RadTextBox radTextBox = (RadTextBox) row.FindControl("txtBoxBegin");
               if (radTextBox != null)
               {
                   criteriaOne = radTextBox.Text;
               }

               radTextBox = (RadTextBox)row.FindControl("txtBoxEnd");
               if (radTextBox != null)
               {
                   criteriaTwo = radTextBox.Text;
               }

           }
           else if(controlTypeId == "2")
           {
               RadComboBox radComboBox = (RadComboBox)row.FindControl(string.Format("cbo{0}Begin",id));
               if (radComboBox != null)
               {
                   criteriaOne = radComboBox.SelectedValue;
               }
           }
       } 
    }