我正在使用带有批量更新的gridview。在对列进行更改并点击页面中的更新按钮后,执行此foreach循环以进行更新。现在,如何在循环后将这些字符串值添加到arraylist
protected void btnUpdate_Click(object sender, EventArgs e)
{
try
{
foreach (GridViewRow row in gvDetails.Rows)
{
string strID = ((Label)row.FindControl("lblID")).Text;
string strGroup = ((Label)row.FindControl("lblGrp")).Text;
string strValue = ((TextBox)row.FindControl("txtValue")).Text;
}
ArrayList alList = new ArrayList();
alList.Add(strID);
alList.Add(strGroup);
alList.Add(strValue);
}
catch (Exception ex)
{
}
}
但循环后字符串的值不会插入到arraylist中。凡有人帮我解决这个问题。
答案 0 :(得分:2)
您有(范围)(变量)问题。在循环之前声明你的字符串。你的arraylist ....错误......列表持有者对象。
try
{
List<string> alList = new List<string>();
string strID = string.Empty;
string strGroup = string.Empty;
string strValue = string.Empty;
foreach (GridViewRow row in gvDetails.Rows)
{
strID = ((Label)row.FindControl("lblID")).Text;
strGroup = ((Label)row.FindControl("lblGrp")).Text;
strValue = ((TextBox)row.FindControl("txtValue")).Text;
}
alList.Add(strID);
alList.Add(strGroup);
alList.Add(strValue);
}
catch (Exception ex)
{
}
APPEND:
我建议创建一个DTO(数据传输对象),然后填充它们,并将它们作为您发送给方法的对象/集合,将值保存到数据库中。
namespace MyApplication.Domain
{
[System.Diagnostics.DebuggerDisplay("ID = {ID}, GroupName = {GroupName}, Value='{Value}'")]
public partial class MyDto
{
public int ID { get; set; } /* PK */
public string GroupName { get; set; }
public string Value { get; set; }
}
}
try
{
List<MyDto> dtoCollection = new List<MyDto>();
foreach (GridViewRow row in gvDetails.Rows)
{
string strID = ((Label)row.FindControl("lblID")).Text;
string strGroup = ((Label)row.FindControl("lblGrp")).Text;
string strValue = ((TextBox)row.FindControl("txtValue")).Text;
MyDto newItem = new MyDto () {ID = Convert.ToInt32(strID), Group = strGroup, Value = strValue};
dtoCollection.Add(newItem);
}
int count = dtoCollection.Count;
/* now send your dtoCollection to your BusinessLayer ... have your businesslayer validate the input data......then have the business layer call your datalayer...and use the List<MyDto> objects to update your database */
}
catch (Exception ex)
{
}
答案 1 :(得分:1)
看起来你的代码应该是
var alList = new List<string>();
foreach (GridViewRow row in gvDetails.Rows)
{
string strID = ((Label)row.FindControl("lblID")).Text;
string strGroup = ((Label)row.FindControl("lblGrp")).Text;
string strValue = ((TextBox)row.FindControl("txtValue")).Text;
alList.Add(strID);
alList.Add(strGroup);
alList.Add(strValue);
}
否则你会尝试添加到超出范围的列表变量中(因为strID
而其他人已在循环内部范围内声明)
注意:请勿使用ArrayList
它已过时。在您的情况下,最好使用List<string>
。
或者,如果我错过了你的观点,你需要添加列表,只列出上次迭代中的变量(因为它可以从你的代码中猜出) - 然后声明strID
和其他变量在之外>循环,像这样:
string strID = null, strGroup = null, strValue = null;
var alList = new List<string>();
foreach (GridViewRow row in gvDetails.Rows)
{
strID = ((Label)row.FindControl("lblID")).Text;
strGroup = ((Label)row.FindControl("lblGrp")).Text;
strValue = ((TextBox)row.FindControl("txtValue")).Text;
}
alList.Add(strID);
alList.Add(strGroup);
alList.Add(strValue);
<强>更新强>
由于我们已在评论中澄清了您的目标,实际上您不需要List<string>
而是DataTable
,因此您的代码可能如下所示:
var dt = new DataTable();
dt.Columns.Add("ID", typeof(string));
dt.Columns.Add("Group", typeof(string));
dt.Columns.Add("Value", typeof(string));
foreach (GridViewRow row in gvDetails.Rows)
{
var dro = dt.NewRow();
dro["ID"] = ((Label)row.FindControl("lblID")).Text;
dro["Group"] = ((Label)row.FindControl("lblGrp")).Text;
dro["Value"] = ((TextBox)row.FindControl("txtValue")).Text;
dt.Rows.Add(dro);
}
另请注意 - 数据表列的数据类型可以是任何数据类型,而不仅仅是字符串 - 它取决于您要存储的实际数据。