2016-06-18 3 views
1

文字列を含む各列の各セルに編集可能なComboBoxを配置する自動生成GridViewを作成しようとしています。各列の選択可能な項目は、DataTableのその列に既にある値と一致する必要があります。以下のコードはほぼ達成されていますが、なんらかの理由で、すべての列のドロップダウンリストに、最後の列のドロップダウンリストが表示されます。AutoGeneratingColumnはすべてのドロップダウンリストを最終列のもので埋めるのはなぜですか?

private void dataGrid_AutoGeneratingColumn(object sender, 
     DataGridAutoGeneratingColumnEventArgs e) { 
     if (e.PropertyType == typeof(string)) { 
      DataGridTemplateColumn comboColumn = new DataGridTemplateColumn(); 
      comboColumn.Header = e.PropertyName; 
      comboColumn.CellTemplate = (DataTemplate)Resources["ComboBoxDataTemplate"]; 
      FrameworkElementFactory comboBoxFactory = new FrameworkElementFactory(typeof(ComboBox)); 
      List<string> list = (DataContext as MainVM).PartClassVM.DataTable.AsEnumerable() 
       .Select(row => row[e.PropertyName].ToString()).Distinct().ToList<string>(); 
      comboBoxFactory.SetValue(ComboBox.ItemsSourceProperty, list); 
      comboColumn.CellTemplate.VisualTree = comboBoxFactory; 
      e.Column = comboColumn; 
     } 
    } 

誰にもこれが起こっている理由とその回避方法を説明できますか?前もって感謝します。

答えて

0

ColumnTypeがデフォルトでStringのタイプに設定されていることがあります。

しかし、あなたはあなたのDataTableを移入しているとき、あなたは明示的に列にタイプを設定することができます:あなたが使用できる

YourDataTable.Columns.Add("Column 1", typeof(bool)); 
YourDataTable.Columns.Add("Column 2", typeof(string)); 
YourDataTable.Columns.Add("Column 3", typeof(int)); 
YourDataTable.Columns.Add("Column 4", typeof(double)); 

と種類に基づいて、必要なDataGridTemplateColumn

if (e.PropertyType == typeof(string)) { 
    ... 
} 
else if(e.PropertyType == typeof(bool)) { 
    ... 
} 
else if(e.PropertyType == typeof(int)) { 
... 
} 

は、あなたは何を見ることができますタイプDataTableでサポートthe MSDN article.

DataTableを使用して、独自のカスタムタイプ(Person、Department、Carなど)をサポートします。 DataTableを継承したカスタムDataTableを作成する必要があります。

更新:

私はわからない、しかし、私の見解では、AutoGeneratingColumnイベントは列(いないセル)をカスタマイズするという目標を持っている - DataTemplateを使用しますが、DataGridを移入ありません。

したがって、DataGridComboBoxColumnDataTableからMVVMアプローチを使用して入力することです。

+0

列A、B、C、DのComboBoxのItemsSourceが列Eの選択可能なオプションのリストにバインドするように見える理由はまだ分かりません。ColumnTypeがstring型に設定されているためです。それは本当に私のためにそれを説明していない。それを拡大してください。 – christiaantober

+0

私が正しく理解していれば、すべての 'DataGridColumns'に' ComboBox'es'がありますか?しかし、 'DataGridColumn'の型が' string'の場合にのみ 'ComboBox'を' DataGridColumn'に表示したいですか?もしそうであれば、 'DataGridColumn's'は全て' string'型です。私があなたに誤解しているかどうかを明確にしてください。 – StepUp

+0

私はすべてのDataGridColumnsにComboBoxesを持っています。それが私の希望です。しかし、すべてのComboBox Columnが提供する選択可能なオプションは現在{"LH1"、 "LH2"、 "RH1"、 "RH2"}です。これは最後の列には正しいが、他の列には正しくない。他の列には、文字列の異なるリストが含まれている必要があります。 – christiaantober

関連する問題