无法在GridView中的TemplateFields的RowEditing事件中查找控件

时间:2016-12-14 10:28:58

标签: c# asp.net gridview findcontrol templatefield

我正在从代码隐藏向gridview添加列。 对于boundfields,我可以在更新行时找到控件和文本框值。 但对于模板字段,我无法控制后面的代码,所以我无法获得文本框值。 请建议如何在模板字段的代码隐藏中获取文本框值

我的代码

protected void gvbind()
{
    conn.Open();
    string Query = "SELECT * FROM testactiondatabase_db.actions";
    MySqlCommand MyCommand2 = new MySqlCommand(Query, conn);

    MySqlDataAdapter MyAdapter = new MySqlDataAdapter();
    MyAdapter.SelectCommand = MyCommand2;
    DataTable dt = new DataTable();
    MyAdapter.Fill(dt);

    TaskGridView.Columns.Clear();
    for (int i = 0; i < dt.Columns.Count; i++)
    {
        if (dt.Columns[i].ColumnName.ToString().ToUpper().Contains("DATE"))
        {
            TemplateField bfield = new TemplateField();
            bfield.HeaderTemplate = new GridViewTemplate(ListItemType.Header, dt.Columns[i].ColumnName.ToString());
            bfield.ItemTemplate = new GridViewTemplate(ListItemType.Item, dt.Columns[i].ColumnName.ToString());
            bfield.EditItemTemplate = new GridViewTemplate(ListItemType.EditItem, dt.Columns[i].ColumnName.ToString());
            TaskGridView.Columns.Add(bfield);
        }
        else
        {
            BoundField boundfield = new BoundField();
            boundfield.DataField = dt.Columns[i].ColumnName.ToString();
            boundfield.HeaderText = dt.Columns[i].ColumnName.ToString();
            TaskGridView.Columns.Add(boundfield);
        }
    }

    TaskGridView.DataSource = dt;
    TaskGridView.DataBind();
    TaskGridView.Width = 600;
    TaskGridView.HeaderStyle.CssClass = "header";
    TaskGridView.RowStyle.CssClass = "rowstyle";

    conn.Close();
}

public class GridViewTemplate : ITemplate
{
    ListItemType _templateType;

    string _columnName;

    public GridViewTemplate(ListItemType type, string colname)
    {

        _templateType = type;

        _columnName = colname;
    }

    void ITemplate.InstantiateIn(System.Web.UI.Control container)
    {
        switch (_templateType)
        {
            case ListItemType.Header:
                Label lbl = new Label();
                lbl.Text = _columnName;
                container.Controls.Add(lbl);
                break;

            case ListItemType.Item:
                Label lb1 = new Label();
                lb1.DataBinding += new EventHandler(lb1_DataBinding);
                container.Controls.Add(lb1);
                break;

            case ListItemType.EditItem:
                TextBox tb1 = new TextBox();
                tb1.ID = _columnName;
                tb1.DataBinding += new EventHandler(tb1_DataBinding);
                tb1.Attributes.Add("class", "myDatePickerClass");
                container.Controls.Add(tb1);
                break;

            case ListItemType.Footer:
                CheckBox chkColumn = new CheckBox();
                chkColumn.ID = "Chk" + _columnName;
                container.Controls.Add(chkColumn);
                break;
        }
    }

    void tb1_DataBinding(object sender, EventArgs e)
    {
        TextBox txtdata = (TextBox)sender;
        GridViewRow container = (GridViewRow)txtdata.NamingContainer;
        object dataValue = DataBinder.Eval(container.DataItem, _columnName);
        if (dataValue != DBNull.Value)
        {
            txtdata.Text = Convert.ToDateTime(dataValue.ToString()).ToString("dd/MM/yyyy");
        }
    }

    void lb1_DataBinding(object sender, EventArgs e)
    {
        Label txtdata = (Label)sender;
        GridViewRow container = (GridViewRow)txtdata.NamingContainer;
        object dataValue = DataBinder.Eval(container.DataItem, _columnName);
        if (dataValue != DBNull.Value)
        {
            txtdata.Text = Convert.ToDateTime(dataValue.ToString()).ToString("dd/MM/yyyy");
        }
    }
}

我在更新行时使用以下代码读取模板字段文本框值,但单元格的控件为0。

GridViewRow row = (GridViewRow)TaskGridView.Rows[e.RowIndex];
TextBox textnew = (TextBox)row.Cells[j].Controls[0];

1 个答案:

答案 0 :(得分:0)

尝试使用FindControl。

TextBox textnew = TaskGridView.Rows[e.RowIndex].FindControl(_columnName) as TextBox;

但是,如果我使用这样的代码片段,手动设置EditIndex,它也可以工作...... te TextBox的值是单元格1已更改。

TaskGridView.EditIndex = 1;
TaskGridView.DataSource = dt;
TaskGridView.DataBind();
TaskGridView.Width = 600;
TaskGridView.HeaderStyle.CssClass = "header";
TaskGridView.RowStyle.CssClass = "rowstyle";

GridViewRow row = (GridViewRow)TaskGridView.Rows[TaskGridView.EditIndex];
TextBox textnew = (TextBox)row.Cells[1].Controls[0];
textnew.Text = "test";