4

I am wondering how I can get the value from an asp.net textbox that is dynamically created inside an asp:datalist. I would like to then insert these values back into the database.

Let say we have the following output on the web page from the datalist. (Each Question is a asp:textbox)

Question 1
    Answer 1
    Answer 2
Update Button

Question 2
    Answer 1
    Answer 2
Update Button

Question 3
    Answer 1
    Answer 2
Update Button

For example: I would like to get the value from Question 2 textbox and then parse the value to my database insert method. How can this be done as the text boxes are generated dynamically in the data list?

I have written the following:

<asp:DataList runat="server" id="dgQuestionnaire" DataKeyField="QuestionID" CssClass="confirm">
                    <ItemTemplate>
                        <h3>Question <asp:Label ID="lblOrder" runat="server" Text='<%# Container.ItemIndex  + 1 %>'></asp:Label></h3>
                        <asp:TextBox runat="server" ID="QuestionName" Text='<%# Eval("QuestionText") %>' CssClass="form"></asp:TextBox>
                        <asp:DataList ID="nestedDataList" runat="server">
                            <ItemTemplate> 
                                 <asp:TextBox ID="AnswerBox" runat="server" CssClass="form" Text='<%# Eval("AnswerTitle") %>' Width="300px"></asp:TextBox>
                            </ItemTemplate>
                        </asp:DataList>
                        <asp:Button runat="server" ID="updateName" CssClass="button_update" style="border: 0px;" onClick="UpdateQuestionName_Click" />    
                    </ItemTemplate> 
                </asp:DataList>

And here the code behind (sorry about the length)

protected void UpdateQuestionName_Click(object sender, EventArgs e)
        {
            int QuestionnaireId = (int)Session["qID"];
            GetData = new OsqarSQL();
            // Update question name
            GetData.InsertQuestions(QuestionName.Text, QuestionnaireId);

        } // End NewQNRButton_Click

        public void BindParentDataList(int QuestionnaireID)
        {
            _productConn = new SqlConnection();
            _productConnectionString += "data source=mssql.myurl.com; Initial Catalog=database_2;User ID=userid;Password=aba123";
            _productConn.ConnectionString = _productConnectionString;
            SqlCommand myCommand = new SqlCommand("GetQuestion", _productConn);
            myCommand.CommandType = CommandType.StoredProcedure;
            myCommand.Parameters.Add(new SqlParameter("@QUEST_ID", SqlDbType.Int));
            myCommand.Parameters[0].Value = QuestionnaireID;
            // check the connection state and open it accordingly.
            _productConn.Open();
            // Sql datareader object to read the stream of rows from SQL Server Database
            SqlDataReader myDataReader = myCommand.ExecuteReader();
            // Pass the Sql DataReader object to the DataSource property
            // of DataList control to render the list of items.
            dgQuestionnaire.DataSource = myDataReader;
            dgQuestionnaire.DataBind();
            // close the Sql DataReader object
            myDataReader.Close();
            // check the connection state and close it accordingly.
            if (_productConn.State == ConnectionState.Open)
                _productConn.Close();
            // foreach loop over each item of DataList control
            foreach (DataListItem Item in dgQuestionnaire.Items)
            {
                BindNestedDataList(Item.ItemIndex);
            }
        }

        public void BindNestedDataList(int ItemIndex)
        {
            int QuestionID = Convert.ToInt32(dgQuestionnaire.DataKeys[ItemIndex]);
            SqlCommand myCommand = new SqlCommand("GetAnswer", _productConn);
            myCommand.CommandType = CommandType.StoredProcedure;
            myCommand.Parameters.Add("@QUESTION_ID", SqlDbType.Int).Value = QuestionID;
            // check the connection state and open it accordingly.
            if (_productConn.State == ConnectionState.Closed)
                _productConn.Open();
            // Sql datareader object to read the stream of rows from SQL Server Database
            SqlDataReader myDataReader = myCommand.ExecuteReader();
            // findControl function to get the nested datalist control
            DataList nestedDataList = (DataList)dgQuestionnaire.Items[ItemIndex].FindControl("nestedDataList");
            nestedDataList.DataSource = myDataReader;
            nestedDataList.DataBind();
            // close the Sql DataReader object
            myDataReader.Close();
            // check the connection state and close it accordingly.
            if (_productConn.State == ConnectionState.Open)
                _productConn.Close();
        }

How can I get the value of a textbox when its corresponding button "updateName" is pressed?

Thanks

4
  • How about reading the Request post data? Commented Jan 13, 2012 at 2:54
  • @Alpha I'm not sure what you mean by this. Commented Jan 13, 2012 at 3:16
  • There's a Request element in the HttpContext property, in there you can access the raw data sent through POST. You will probably find there all the info for the controls you created. However, I haven't posted this as an answer because it's not really "tidy" and you could end up with a mess of logic in searching for those values. Commented Jan 13, 2012 at 19:26
  • Check this link: forums.asp.net/t/1204372.aspx/… it may help. The big issue is knowing which of the buttons caused the event and which one is the associated textbox. Commented Jan 13, 2012 at 20:49

1 Answer 1

1

You can try doing something like this (code updated):

    protected void UpdateQuestionName_Click(object sender, EventArgs e)
    {
        int QuestionnaireId = (int)Session["qID"];
        GetData = new OsqarSQL();

        //get the button that caused the event
        Button btn = (sender as Button);
        if (btn != null)
        {
                //here's you question text box if you need it
                TextBox questionTextBox = (btn.Parent.FindControl("QuestionName") as TextBox);

                // Update question name
                GetData.InsertQuestions(questionTextBox.Text, QuestionnaireId);



                //and in case you want more of the associated controls
                //here's your data list with text boxes
                DataList answersDataList = (btn.Parent.FindControl("nestedDataList") as DataList);
                //and if answersDataList != null, you can use answersDataList.Controls to access the child controls, where answer text boxes are
        }

    } // End NewQNRButton_Click

This should work as you want.

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

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.