0

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>

2 Answers 2

2

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.

Sign up to request clarification or add additional context in comments.

Comments

1

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.