2017-05-22 18 views
1

私は、ユーザーがポップアップ入力ボックスを使って各セルにメモを付けることができるカスタムDataGridを作成しようとしています。現在、DataGridを継承したCustomDataGridクラスを作成しましたが、ContextMenuにはノートを追加するオプションがあります。ユーザーがノートを追加することを選択すると、選択されたセルが見つけられ、入力ボックスが開き、レスポンスが返され、文字列のリストに格納されます。しかし、時にはセルが選択されていないことがあり、「オブジェクト参照がオブジェクトのインスタンスに設定されていません」というエラーメッセージが表示されるため、これは常に機能しません。独自のContextMenuと注釈文字列を持つDataGridCellを継承して、CustomDataGridCellクラスを作成することを考えています。質問は、どのように私はCustomDataGrid内のすべてのセルをCustomDataGridCellにするのですか?これを行うより良い方法はありますか?ここでWPFカスタムDataGridCellでカスタムDataGridを作成する方法は?

は私の現在のCustomDataGridクラスです:

public class CustomDataGrid : DataGrid 
{ 
    MenuItem miAddNote; 
    List<List<string>> notes; 

    public CustomDataGrid() 
    { 
     notes = new List<List<string>>(); 

     miAddNote = new MenuItem(); 
     miAddNote.Click += MiAddNote_Click; 
     miAddNote.Header = "Add a note"; 

     this.ContextMenu = new ContextMenu(); 
     this.ContextMenu.Items.Add(miAddNote); 
    } 

    private void MiAddNote_Click(object sender, RoutedEventArgs e) 
    { 
     try 
     { 
      int rowIndex = this.SelectedIndex; 
      int colIndex = this.SelectedCells[0].Column.DisplayIndex; 
      InputBox ib = new InputBox(notes[rowIndex][colIndex]); 
      if (ib.ShowDialog() == true) 
      { 
       notes[rowIndex][colIndex] = ib.Response; 
      } 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
    } 

    protected override void OnLoadingRow(DataGridRowEventArgs e) 
    { 
     base.OnLoadingRow(e); 

     int numColumns = this.Columns.Count; 
     List<string> newRow = new List<string>(); 

     for (int i = 0; i < numColumns; ++i) 
     { 
      newRow.Add(""); 
     } 
     notes.Add(newRow); 
    } 
} 
+0

芋あなたが見てする必要があるデータグリッドの一部がDataGridColumnのです。たぶん、TemplateColumnで既に十分です。 http://www.wpf-tutorial.com/datagrid-control/custom-columns/ – jHilscher

答えて

1

、どのように私は私のCustomDataGrid CustomDataGridCell内のすべてのセルになるだろうされた質問?

私は恐れがあります。また、例外を取り除くためにカスタムセルタイプを作成する必要はありません。

これを行うより良い方法はありますか?

あなたは、単に任意の選択された細胞はいずれにもアクセスしようとする前に存在しているかどうかを確認する必要があります

private void MiAddNote_Click(object sender, RoutedEventArgs e) 
{ 
    int rowIndex = this.SelectedIndex; 
    if (rowIndex != -1 && SelectedCells != null && SelectedCells.Count > 0) 
    { 
     int colIndex = this.SelectedCells[0].Column.DisplayIndex; 
     InputBox ib = new InputBox(notes[rowIndex][colIndex]); 
     if (ib.ShowDialog() == true) 
     { 
      notes[rowIndex][colIndex] = ib.Response; 
     } 
    } 
} 
関連する問題