Looping through DataList and reading TextBox values on Button Click


B

bwalke

I am developing a web form which is going to be used for manufacturing
input. The form uses a DataList which list a batch of parts that may
range anywhere from 1-9 parts. The DataList contains 6 textboxes
pre-fill with data (reason for using datalist) which will capture user
input and changes to the textboxes. So the 6 textboxes in columns will
be constant but the rows will vary representing each part. I am
looking to loop through each row and grab the values of the 6
textboxes. Without using the Edit commands on the datalist is it
possible to find the textbox values in each row. I want to have the
whole datalist read back into the database on a button click. Is this
possible. Best ways of going about it. Hope this makes sense.

Thanks,

Brett
 
Ad

Advertisements

T

Teemu Keiski

Hi,

yes it is. You can loop through dataList's Items collection and then for
every item, locate the relevant controls.

Dim dlitem As DataListItem
Dim tb1 As TextBox
Dim tb2 As TextBox
....
For Each dlitem in DataList1.Items

tb1=CType(dlitem.FindControl("TextBox1"),TextBox)
tb2=CType(dlitem.FindControl("TextBox2"),TextBox)
...
'here do something with each row

Next
....
 
J

Jeremy S

If anyone has a better way than what I show below, I'd really like to know.
I have extensively researched this exact same question and no one has every
suggested anything other than what the code below does. Basically you have
too loop through the Form collection:


//This line is in your Page code-behind
dataClass.LoopThroughFormCollection(Request.Form); // pass Request.Form to a
method that will loop through it.

// This method is in a separate class
public void
LoopThroughFormCollection(System.Collections.Specialized.NameValueCollection
formCollection) {

int currentControlNumber = 0; // Your TextBox will appear many times -
ASP.NET will number each one uniquely - so you might want to parse this out
string strTemp = "";
string controlName = "";
int delPos = 0; //delimiter position
string controlValue = "";

String[] arrayFormKeys = formCollection.AllKeys;


// Loop through all of the controls in the Form collection
for (loop = 0; loop < arrayFormKeys.Length; loop++) {

// Parse out the control name and number from the form KEY value, and then
get the value associated with that KEY.
// This is an example of what we're parsing from the form KEY value:
"MyDataListName:_ctl1:MyTextBox"
if (arrayFormKeys[loop].StartsWith("MyDataListName")) {
strTemp = arrayFormKeys[loop].Replace("MyDataListName:_ctl", "");
delPos = strTemp.IndexOf(":", 0); // delimiter position
currentControlNumber = Convert.ToInt32(strTemp.Substring(0, delPos));
controlName = strTemp.Substring(delPos + 1, (strTemp.Length - (delPos +
1)));
controlValue = formCollection[arrayFormKeys[loop]];
// At this point you have everything you need to know about the current
row in your DataList that was returned via the Form collection

if (controlName == "MyTextBox") {
// Do something here; write textbox value to db or whatever.
}
}
}
}

-HTH
 
J

Jeremy S

I wish I had discovered that a year ago when I was just getting started.
Thanks! My Form looping logic (in my response to the OP) can be disregarded
(and I'll be doing some refactoring this weekend!).
 
Ad

Advertisements

T

Teemu Keiski

The "pattern" is quite similar for all databound controls like Repeater,
DataList and DataGrid. You just loop through the Items collection. Type of
the item is respectively RepeaterItem, DataListItem and DataGridItem. Then
again one can run FindControl etc against it.

Nice to know that my response helped.
 

Top