WPF 如何使用自定义 DataGridCells 创建自定义 DataGrid?
WPF How to create custom DataGrid with custom DataGridCells?
我想创建一个自定义 DataGrid,以便用户可以使用弹出输入框将注释附加到每个单元格。目前我已经创建了一个 CustomDataGrid class,它继承自 DataGrid,带有一个可以添加注释的 ContextMenu。当用户选择添加注释时,我找到选定的单元格,打开一个输入框和 returns 响应,并将其存储在字符串列表列表中,其中每个字符串列表代表一行。然而,这并不总是有效,因为有时没有选择单元格,我收到一条错误消息:'Object reference not set to an instance of an object.'。我正在考虑创建一个 CustomDataGridCell class,继承自 DataGridCell,它有自己的 ContextMenu 和注释字符串。问题是,如何将 CustomDataGrid 中的所有单元格都设为 CustomDataGridCell?有更好的方法吗?
这是我当前的 CustomDataGrid class:
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);
}
}
The question is, how would I make all cells in my CustomDataGrid a CustomDataGridCell?
恐怕没有简单的方法可以做到这一点。并没有必要创建自定义单元格类型来消除异常。
Is there a better way to do this?
在尝试访问任何单元格之前,您应该简单地检查是否有任何选定的单元格:
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;
}
}
}
我想创建一个自定义 DataGrid,以便用户可以使用弹出输入框将注释附加到每个单元格。目前我已经创建了一个 CustomDataGrid class,它继承自 DataGrid,带有一个可以添加注释的 ContextMenu。当用户选择添加注释时,我找到选定的单元格,打开一个输入框和 returns 响应,并将其存储在字符串列表列表中,其中每个字符串列表代表一行。然而,这并不总是有效,因为有时没有选择单元格,我收到一条错误消息:'Object reference not set to an instance of an object.'。我正在考虑创建一个 CustomDataGridCell class,继承自 DataGridCell,它有自己的 ContextMenu 和注释字符串。问题是,如何将 CustomDataGrid 中的所有单元格都设为 CustomDataGridCell?有更好的方法吗?
这是我当前的 CustomDataGrid class:
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);
}
}
The question is, how would I make all cells in my CustomDataGrid a CustomDataGridCell?
恐怕没有简单的方法可以做到这一点。并没有必要创建自定义单元格类型来消除异常。
Is there a better way to do this?
在尝试访问任何单元格之前,您应该简单地检查是否有任何选定的单元格:
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;
}
}
}