Почему я не получаю значение последней строки редактируемого столбца datagridview в приложении C# winForms?

Я создал пользовательский элемент управления, который имеет элемент управления 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. Тогда почему я не могу прочитать столбец «Наблюдается (сек)», который можно редактировать?

Я не могу понять, чего мне не хватает. Пожалуйста, помогите мне решить эту проблему. Заранее спасибо!!


person User0804    schedule 21.12.2018    source источник


Ответы (2)


Вы знаете, что ваш получатель вызывается каждый раз, когда вы обращаетесь к члену, что означает, что с вашим данным кодом - каждый раз, когда вы обращаетесь к списку, он будет становиться все больше и больше, поскольку вы не очищаете или повторно создаете список при доступе, поэтому он растет бесконечно . - Я бы посоветовал сначала исправить эту проблему, а затем снова проверить ваши значения.

Измените своего участника 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;
    }
}
person Rand Random    schedule 21.12.2018
comment
Я внес изменения, указанные в ответе, но все еще не получил значение последней строки. - person User0804; 21.12.2018
comment
Я отредактировал свой вопрос и добавил данные текстового файла, откуда я получаю строку и столбец. - person User0804; 21.12.2018

Вместо этого попробуйте цикл 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);
        }
person TempoClick    schedule 21.12.2018
comment
Обновите диапазон в цикле for до dgv_us.Rows.Count() - 1 - person TempoClick; 21.12.2018