从GridF的TemplateFields中动态创建的控件中获取数据

时间:2014-08-12 04:17:37

标签: c# asp.net .net

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

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

这是我的gridview

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

这是我创建控件的代码:

public void Page_PreRender(object sender, EventArgs e)
    {
        TryAction(PrepareLoad);
    }
private void PrepareLoad()
    {
        if (IsPostBack) return;
        BindData(); 
    }
private void BindData()
    {
        gvSearchCriteria.DataSource = null;
        gvSearchCriteria.DataSource = SearchFieldList;
        gvSearchCriteria.DataBind();
    } 
protected void gvSearchCriteria_OnRowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            SearchField searchField = e.Row.DataItem as SearchField;
            if (searchField != null)
            {
                e.Row.Cells[0].Text = searchField.SearchFieldId.ToString();
                e.Row.Cells[4].Text = searchField.ControlTypeId.ToString();

                CheckBox checkBox = (CheckBox)e.Row.FindControl("cbDisplay");
                checkBox.Text = searchField.FieldDescription;
                checkBox.Checked = searchField.Checked;
                checkBox.Enabled = true;

                if (searchField.ControlTypeId.ToString() == "1")
                {
                    RadTextBox textBox = new RadTextBox();
                    textBox.ID = "txtBoxBegin";
                    e.Row.Cells[2].Controls.Add(textBox);

                    textBox = new RadTextBox();
                    textBox.ID = string.Format("txt{0}End", searchField.SearchFieldId);
                    e.Row.Cells[3].Controls.Add(textBox);

                }
                else if (searchField.ControlTypeId.ToString() == "2")
                {
                    RadComboBox comboBox = new RadComboBox();
                    comboBox = new SearchService().GetRadComboBoxById(searchField.SearchFieldId);
                    comboBox.ID = string.Format("cbo{0}Begin", searchField.SearchFieldId);
                    e.Row.Cells[2].Controls.Add(comboBox);
                }
            }
        }
    }

这一切都运行良好,并使用复选框创建控件。 这是我的代码,用于尝试遍历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。 每次使用正确的Id,单元格0都会恢复正常。 cbDisplay复选框始终返回是否检查行,单元格4获取ControlTypeId就好了。我无法获取值的TemplateFields。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

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