Невидимые строки DataGridView видны на нескольких страницах TabControl - PullRequest
0 голосов
/ 29 октября 2018

У меня есть TabControl с несколькими TabPage-ы. Каждый TabPage хранит соответствующий объект DataGridView который, в свою очередь, связан с соответствующим DataTable. Каждый объект DataTable представляет собой строковую таблицу из 3 столбцов (имена, значения, комментарии). Таким образом, каждая вкладка выглядит как хорошая таблица сетки. Все в порядке. Во время этой привязки я хочу скрыть несколько строк в каждой вкладке.

DataFridView LoadDataToTab(ref DataTable dt, TabPage tab)
{    
    DataGridView grid   = new DataGridView();    
    BindingSource source = new BindingSource();    
    source.DataSource = dt;     
    grid.DataSource = source;    

    tab.Control.Add(grid);    
    // Now all binding is done;    

    // Now I need to hide some rows in TabPage-s:    
    HideSomeRows(ref grid);    

    return grid;    
} 

void HideSomeRows(ref DataGridView grid)
{
    for (int i = 0; i < grid.Rows.Count; i++)
    {
        string val = grid.Rows[i].Cells[0].Value.ToString();
        // SomeString is some "xyz" stirng
        if( val == SomeString    ||
            val == SomeOtherString)
        {
            grid.Rows[i].Visible = false;
        }
    }
}

Проблема: только «первая» TabPage в этом TabControl скрывает указанные строки.

  • На всех других вкладках отображаются все строки (не скрывайте строки). «Первый» означает, первый, который использовал HideSomeRows () , а затем он сначала добавляется в TabControl. Я сделал несколько экспериментов, чтобы обойти первый TabPage. Вторая TabPage, которая стала первой, скрывает строки, но другие нет.
  • Я также проверил, используя точки останова, что все «не первые» вкладки имеют Свойство Видимые ложные строки, но строки видимы!

1 Ответ

0 голосов
/ 05 ноября 2018

После нескольких экспериментов вместе с моим коллегой мы нашли решение: , чтобы выбрать текущую TabPage в TabControl, прежде чем скрыть строки DataGridView:

    ...
    Tab.SelectedIndex = tabIndex;
    ...
    HideSomeRows(ref grid); 

Пожалуйста, посмотрите ту же программу, которая изменилась для корректной работы с дополнением, подписанной

      /*!*/

.

DataFridView LoadDataToTab(ref DataTable dt, TabPage tab, TabControl Tab/*!*/, int tabIndex/*!*/)
{    
    DataGridView grid   = new DataGridView();    
    BindingSource source = new BindingSource();    
    source.DataSource = dt;     
    grid.DataSource = source;    

    tab.Control.Add(grid);    
    // Now all binding is done;  

    // This TabControl Tab has inside TabPage tab 
    Tab.SelectedIndex = tabIndex; /*!*/

    // Now I need to hide some rows in TabPage-s:    
    HideSomeRows(ref grid);    

    return grid;    
} 

void HideSomeRows(ref DataGridView grid)
{
    for (int i = 0; i < grid.Rows.Count; i++)
    {
        string val = grid.Rows[i].Cells[0].Value.ToString();
        // SomeString is some "xyz" stirng
        if( val == SomeString    ||
            val == SomeOtherString)
        {
            grid.Rows[i].Visible = false;
        }
    }
}       
...