如何使用C#读取gridview中的动态添加文本框值?

时间:2016-05-11 07:58:21

标签: c# asp.net

我想在GridView的每个单元格中使用TextBox动态添加行和列。我成功完成了这个。但问题是当我点击一个按钮时,我无法读取TextBox的值。

<asp:GridView runat="server" ID="gv" OnRowDataBound="gv_OnRowDataBound"></asp:GridView>

在网格中动态添加行和列:

protected void btnGenerate_OnClick(object sender, EventArgs e)
{
    int rowsCount = Convert.ToInt32(tbxRow.Text);
    int colsCount = Convert.ToInt32(tbxCol.Text);
    DataTable dt=new DataTable();
    for(int col=0;col<colsCount;col++)
    {
        dt.Columns.Add("D-" + col, typeof (int));
    }
    for (int i = 0; i < rowsCount; i++)
    {
        DataRow dr = dt.NewRow();
        dt.Rows.Add(dr);
    }
    gv.DataSource = dt;
    gv.DataBind();
}

这是我将TextBox添加到GridView的代码:

protected void gv_OnRowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        for (int i = 0; i < e.Row.Cells.Count; i++)
        {
            TextBox txt = new TextBox();
            txt.ID = "tbx" + i;
            e.Row.Cells[i].Controls.Add(txt);
        }
    }
}

我试过这个来获取TextBox的值,但它总是显示为null:

protected void btnSave_OnClick(object sender, EventArgs e)
{
    foreach (GridViewRow row in gv.Rows)
    {
        if (row.RowType == DataControlRowType.DataRow)
        {
            for (int i = 0; i < row.Cells.Count; i++)
            {
                TextBox tb = (TextBox) row.Cells[i].FindControl("tbx" + i);
            }

        }
    }
}

1 个答案:

答案 0 :(得分:1)

您必须在OnRowCreated中添加它们,这不仅在您对网格进行数据绑定时触发每个回发:

protected void gv_OnRowCreated(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        for (int i = 0; i < e.Row.Cells.Count; i++)
        {
            TextBox txt = new TextBox();
            txt.ID = "tbx" + i;
            e.Row.Cells[i].Controls.Add(txt);
        }
    }
}

因此,您必须使用初始化并在RowCreated中添加它们,如果要分配文本,请使用RowDataBound

但为什么不使用TemplateField并在那里添加文本框。这让你的生活更轻松。

Side-Note:您不需要DataControlRowType.DataRow - 检查您是否枚举网格的Rows - 属性,因为只返回DataRow项:

protected void btnSave_OnClick(object sender, EventArgs e)
{
    foreach (GridViewRow row in gv.Rows)
    {
        for (int i = 0; i < row.Cells.Count; i++)
        {
            TextBox tb = (TextBox) row.Cells[i].FindControl("tbx" + i);
        }
    }
}