2015-01-31 7 views
0

У меня проблема с WPF DataGrid. Я пытаюсь удалить datagrid, добавлять столбцы и заполнять его данными из базы данных, а не скрывать 1 столбец, который является идентификатором, который пользователю не нужно видеть.Скрытие столбцов в коде, сгенерированном WPF DataGrid

Но когда я пытаюсь, он говорит, что DataGrid columnsCount равен 0, даже после добавления всего в конце метода. Я даже попытался скрыть его другим методом после первого, но все же той же ошибки. Так что мой трюк, чтобы сделать это очень грязно, и я хочу узнать, как это сделать лучше.

это мой простой код вставки столбцов и т.д., чтобы DataGrid:

private void insertSubjects() 
{ 
    DataSet dataSet = DBConnect.Instance.getSubjects(); 
    DataTable subjects = new DataTable(); 
    subjects.Columns.Add("id", typeof(int)); 
    subjects.Columns.Add("Przedmiot", typeof(string)); 

    foreach(DataTable table in dataSet.Tables) 
    { 
     foreach(DataRow row in table.Rows) 
     { 
      subjects.Rows.Add(row["id"], row["name"]); 
     } 
    } 

    subjectsTable.ItemsSource = subjects.DefaultView; 
    new Thread(new ThreadStart(hideColumns)).Start(); 
} 

Моя фиксирующее здесь новый поток, метод, выполнить еще одну, потому что мне нужно сделать это Dispatcher.Invoke, который выглядит как выполнение это:

private void hideColumns() 
{ 
    while (subjectsTable.Columns.Count == 0) 
    { } 
    this.Dispatcher.Invoke(hideColumns2); 
} 
private void hideColumns2() 
{ 
    subjectsTable.Columns[0].Visibility = Visibility.Hidden; 
} 

Проблема заключается в том, когда я был на 1 странице или окна, 2 других DataGrids, и если я хочу, чтобы скрыть столбцы в них обоих, я должен был заполнить их в одном методе.

Я попытался найти ответ для этого, но я потерпел неудачу и исправил свой путь.

+1

Удалите все это и используйте надлежащие XAML и DataBinding. –

+2

@HighCore с дозой MVVM, заброшенной для хорошей меры, я полагаю? –

+0

@ DavidL Это именно то, что я сказал. XAML + DataBinding == MVVM. –

ответ

0

Как вы запрограммировали его, я бы рекомендовал создать объект datacolumn, а затем вставить этот объект datacolumn в datatable. С этим вы можете ссылаться на datacolumn, используя его местоположение.

... 
DataTable subjects = new DataTable(); 
DataColumn idColumn = new DataColumn("id", typeof(int)); 
// You can set various properties of the DataColumn. 
// MSDN Documentation: https://msdn.microsoft.com/en-us/library/x1tyd60z%28v=vs.110%29.aspx 

subject.Columns.Add(idColumn); 

Теперь у вас должен быть доступ к определенному столбцу для ссылки на фактический объект DataColumn. Это псевдообязательный трюк, который я использовал в прошлом.

Смежные вопросы