循环遍历gridview行c#后,将字符串值添加到数组列表中

时间:2015-04-22 15:48:18

标签: c# asp.net gridview

我正在使用带有批量更新的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中。凡有人帮我解决这个问题。

2 个答案:

答案 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);
}

另请注意 - 数据表列的数据类型可以是任何数据类型,而不仅仅是字符串 - 它取决于您要存储的实际数据。