none
Не обнвляется DataGrid при удалении колонки из DataTable RRS feed

  • Вопрос

  • Здравствуйте.

    Во время работы прилжения необходимо удалить выбранные колонки из DataTable:

     DataTable TmpTable = ThisDataset.Tables[tabControl.SelectedIndex];
                    List<DataColumn> dcListToRemove = new List<DataColumn>();
                    foreach (DataColumn dc in TmpTable.Columns)
                    {
                        if (!ColumnNeed(dc))
                        {
                            dcListToRemove.Add(dc);
                        }
                    }
                    foreach (DataColumn dc in dcListToRemove)
                    {
                        dc.Table.Columns.Remove(dc);                    
                    }
                    dcListToRemove.Clear();
                    DataGrid dGrid = ((TabItem)tabControl.SelectedItem).Content as DataGrid;
                    if (dGrid != null)
                    {
                        dGrid.DataContext = TmpTable.DefaultView;
                        dGrid.ItemsSource = TmpTable.DefaultView;
                        
                    }

    При этом из DataTable  (TmpTable) колонки удаляются, а в  DataGrid ( dGrid ) они очищаются, но не удаляются. При попытке изменить значение любой из удаленных колонок соответственно возникает ошибка. 

    Как добиться удаления колонок из DataGrid?

    3 декабря 2012 г. 16:31

Ответы

  • Привет

    Когда вы удаляете столбец из DataTable в окне Output в Visual Studio вы скорей всего должны увидеть ошибки привязки. Это говорит о том, что изменения данных отслеживаются привязкой. Генерация столбцов в DataGrid построена по-другому и не отслеживает изменения структуры таблицы. Для этой пробемы есть 2 решения:

    1) убрать автогенерацию столбцов и самому добавлять/удалять столбцы по мере необходимости. Это более сложное решение

    2) Самое просто решение - это очистить привязку данный и снова ее выполнить, так столбцы перегенерируются и лишнего уже не будет.

                // удаляем столбец из таблицы
                ds.Tables[0].Columns.RemoveAt(2);
                // форсируем перегенерацию столбцов в DataGrid
                dataGrid1.ItemsSource = null;
                dataGrid1.ItemsSource = ds.Tables[0].DefaultView;

    Двусторонний биндинг у вас сделать не получится, т.к. свойство DefaultView - только для чтения. Но просто для сведения, если хотите явно задать привязку, то вы можете это сделать с помощью класса Binding, пример можно посмотреть здесь - Практическое руководство. Создание привязки в коде


    Для связи [mail]

    • Помечено в качестве ответа Abolmasov Dmitry 14 декабря 2012 г. 13:46
    11 декабря 2012 г. 10:54

Все ответы

  • Попробуйте вызвать метод Refresh после удаления.

    3 декабря 2012 г. 16:38
    Модератор
  • Безрезультатно. Мне кажется это из-за OneWay связи.

    Подскажите, как мне в коде установить TwoWay?

    Сейчас делаю так:

                        TabItem tabItem = new TabItem();
                        tabItem.Header = dataTable.TableName;
                        tabControl.Items.Add(tabItem);
                        DataGrid dataGrid = new DataGrid();
                        dataGrid.Name = "Table_" + i.ToString();
                        dataGrid.AllowDrop = false;
                        dataGrid.AutoGenerateColumns = true;                    
                        dataGrid.ItemsSource = dataTable.DefaultView;

    В XAML сделать привязку не могу, т.к. источник формируется динамически - количество таблиц и полей в них заранее неизвестно.

    3 декабря 2012 г. 17:19
  • Привет

    Когда вы удаляете столбец из DataTable в окне Output в Visual Studio вы скорей всего должны увидеть ошибки привязки. Это говорит о том, что изменения данных отслеживаются привязкой. Генерация столбцов в DataGrid построена по-другому и не отслеживает изменения структуры таблицы. Для этой пробемы есть 2 решения:

    1) убрать автогенерацию столбцов и самому добавлять/удалять столбцы по мере необходимости. Это более сложное решение

    2) Самое просто решение - это очистить привязку данный и снова ее выполнить, так столбцы перегенерируются и лишнего уже не будет.

                // удаляем столбец из таблицы
                ds.Tables[0].Columns.RemoveAt(2);
                // форсируем перегенерацию столбцов в DataGrid
                dataGrid1.ItemsSource = null;
                dataGrid1.ItemsSource = ds.Tables[0].DefaultView;

    Двусторонний биндинг у вас сделать не получится, т.к. свойство DefaultView - только для чтения. Но просто для сведения, если хотите явно задать привязку, то вы можете это сделать с помощью класса Binding, пример можно посмотреть здесь - Практическое руководство. Создание привязки в коде


    Для связи [mail]

    • Помечено в качестве ответа Abolmasov Dmitry 14 декабря 2012 г. 13:46
    11 декабря 2012 г. 10:54