1

我创建了具有 datagridview 控件的用户控件。并且 datagridview 正在从文本文件中获取数据以动态创建行和列。我将该用户控件添加到面板。dgv 的一列是可编辑的。我想要列表中的可编辑列值。我得到了除最后一行值之外的所有值。

我的用户界面

主窗体代码

    public static List<string> testValue = new List<string>();

    private void SavetoolStripMenuItem1_Click(object sender, EventArgs e)
    {
        List<string> dummy = new List<string>();
        foreach (Control p in panelUC.Controls)
        {
            if (p is uc_protectionTbl1)
            {
                dummy = ((((uc_protectionTbl1)p).obsValue));
                testValue.AddRange(dummy);  //here I want all values
            }
            if (p is uc_performResult)
            { 

            }

        }

用户控件的代码

    private List<string> listObs = new List<string>();

    private string obs = null;
    public List<string> obsValue
    {
        get
        {
            foreach (DataGridViewRow row in dgv_uc.Rows)
            {
                obs = row.Cells["Observed(Sec)"].Value.ToString();
                listObs.Add(obs);
            }
            return listObs;
        }
    }


In testValue list index I am getting these values 
 [0] = "1";
 [1] = "2";
 [2] = "3";
 [3] = "";  //here I want "4"

 And listObs list I am getting following values
 [0] = "3";
 [1] = "";  //here I also  want "4"


 My TextFile from where I designed dgv

  TestType=Phase Loset Over Current Protection Test (I>)
  Heading=SrNo||Injected Current||Rated 
  Current||Char||Pickup(xIp)||TMS||STD]||Observed(Sec)
  Value=Test-1||0.4||1||NINV3.0||0.2||0.1||0.95-1.00-1.05
  Value=Test-2||7.0||1||NINV3.0||1.0||0.5||1.68-1.76-1.85

  TestType=Earth Lowset Over Current Protection Test (Ie>)
  Heading=SrNo||Injected Current||Rated 
  Current||Char||Pickup(xIn)||TMS||STD||Observed(Sec)
  Value=Test-3||0.2||1||NINV3.0||0.1||0.1||0.95-1.00-1.05
  Value=Test-4||7.0||1||NINV3.0||1.0||0.5||1.68-1.76-1.85

当我阅读“SrNo”列而不是“Observed(Sec)”列时,我从 SrNo 列中获得了所有值。那为什么我无法阅读可编辑的“已观察(秒)”列?

我无法理解我错过了什么。请帮我解决这个问题。提前致谢!!

4

2 回答 2

0

您知道每次访问成员时都会调用您的 getter,这意味着使用给定的代码 - 每次访问列表时它都会变得越来越大 - 因为您没有在访问时清除或重新创建列表,所以它会无限增长. - 我建议先解决这个问题,而不是再次检查你的值。

将您的成员更改obsValue为:

//remove the fields obsValue and obs, and use local variables instead
//private List<string> listObs = new List<string>();
//private string obs = null;

public List<string> obsValue
{
    get
    {
        //create a new list everytime the getter of this member gets called
        var listObs = new List<string>();
        foreach (DataGridViewRow row in dgv_uc.Rows)
        {
            //declare obs here since we only use it here
            var obs = row.Cells["Observed(Sec)"].Value.ToString();
            listObs.Add(obs);
        }
        return listObs;
    }
}
于 2018-12-21T09:49:35.823 回答
0

尝试使用 for 循环

        for (int i = 0; i < dgv_us.Rows.Count(); i++)
        {
           string obs = dgv_uc.Rows[i].Cells["Observed(Sec)"].Value.ToString();
           listObs.Add(obs);
        }
于 2018-12-21T10:07:44.013 回答