在服务器上使用TextBox从ASP.NET GridView获取值

时间:2012-10-18 15:20:08

标签: asp.net gridview viewstate

我有一个带有文本框的网格视图

我想在点击按钮

上获得此文本框的值

但我总是收到“0”(默认)值

我认为这个问题与viewstate有关,但我不确定

请告诉我,我做错了什么?

源代码:

protected void Page_Load(object sender, EventArgs e)
{
    DataSet dataSet = new DataSet("MyDataSet");
    DataTable table = new DataTable();
    table.Columns.Add(new DataColumn("NameValue"));
    table.Columns.Add(new DataColumn("Number"));
    table.Columns.Add(new DataColumn("NumberValue"));
    dataSet.Tables.Add(table);

    DataRow row = dataSet.Tables[0].NewRow();
    row[0] = "Name";
    row[1] = "0";

    dataSet.Tables[0].Rows.Add(row);

    this.MyGridView.DataSource = dataSet;
    this.MyGridView.DataBind();
}

protected void Button1_Click(object sender, EventArgs e)
{
    TextBox txtsn = ((TextBox)this.MyGridView.Rows[0].FindControl("NumberTextBox"));
    string sn = txtsn.Text;
}




<body>
    <form id="form1" runat="server">
    <div>
        <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />
        <asp:GridView ID="MyGridView" AutoGenerateColumns="false" ShowHeader="false" runat="server" >
            <Columns>
                <asp:TemplateField>
                    <ItemTemplate>
                        <asp:Label ID="NameLabel" runat="server" Text='<%#Eval("NameValue")%>' />
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField>
                    <ItemTemplate>
                        <asp:TextBox ID="NumberTextBox" runat="server" Text='<%#Eval("NumberValue")%>' />
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
        </asp:GridView>
    </div>
    </form>
</body>

2 个答案:

答案 0 :(得分:2)

问题是你总是将网格绑定到它的DataSource即使在回发上也是如此。这将覆盖用户所做的所有更改。

而是使用IsPostBack属性:

protected void Page_Load(object sender, EventArgs e)
{
    if(!IsPostback)
    {
        DataSet dataSet = new DataSet("MyDataSet");
        DataTable table = new DataTable();
        table.Columns.Add(new DataColumn("NameValue"));
        table.Columns.Add(new DataColumn("Number"));
        table.Columns.Add(new DataColumn("NumberValue"));
        dataSet.Tables.Add(table);

        DataRow row = dataSet.Tables[0].NewRow();
        row[0] = "Name";
        row[1] = "0";

        dataSet.Tables[0].Rows.Add(row);

        this.MyGridView.DataSource = dataSet;
        this.MyGridView.DataBind();
    }
}

只有在更改了某些内容时才需要重新加载DataSource(例如,删除或添加了记录,用户单击了排序列,或者您已经进行了分页)。但是,你应该只在相应的事件处理程序中而不是在page_load中执行此操作。因此,最好将此代码包装在一个可以从任何地方调用的方法中。

答案 1 :(得分:1)

您是在回发上绑定网格的数据,这会导致此问题。您想检查请求是否是帖子:

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostback)
    {
        DataSet dataSet = new DataSet("MyDataSet");
        DataTable table = new DataTable();
        table.Columns.Add(new DataColumn("NameValue"));
        table.Columns.Add(new DataColumn("Number"));
        table.Columns.Add(new DataColumn("NumberValue"));
        dataSet.Tables.Add(table);

        DataRow row = dataSet.Tables[0].NewRow();
        row[0] = "Name";
        row[1] = "0";

        dataSet.Tables[0].Rows.Add(row);

        this.MyGridView.DataSource = dataSet;
        this.MyGridView.DataBind();
    }
}