Garrett
Garrett

Reputation: 15

Get value from ASP.NET GridView with TextBox on server

I have a gridview with textbox inside

I want to get value of this textbox on button click

But I always receiving "0" (default) value

I think this problem related to viewstate but I'm not sure

Tell me please what I'm doing wrong?

Source code:

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>

Upvotes: 0

Views: 2616

Answers (2)

Tim Schmelter
Tim Schmelter

Reputation: 460258

The problem is that you always bind the grid to it's DataSource even on postbacks. That overrides all changes made by the user.

Instead use the IsPostBack property:

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();
    }
}

You need to reload the DataSource only if something was changed(f.e. a record was deleted or added, the user clicked a sort-column or you have paging). But then you should do that only in the appropriate event handlers and not in page_load. So it's best to wrap this code in a method which you can call from anywhere.

Upvotes: 2

Gromer
Gromer

Reputation: 9931

You're data binding your grid on postbacks, which is causing this issue. You want to check to see if the request is a post:

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();
    }
}

Upvotes: 1

Related Questions