WPF如何使用自定义DataGridCells创建自定义DataGrid?

时间:2017-05-22 19:24:46

标签: c# .net wpf datagrid datagridcell

我希望创建一个自定义DataGrid,以便用户可以使用弹出式输入框将注释附加到每个单元格。目前,我已经创建了一个继承自DataGrid的CustomDataGrid类,其中ContextMenu具有添加注释的选项。当用户选择添加注释时,我找到所选单元格,打开一个输入框并返回响应,然后将其存储在字符串列表列表中,其中每个字符串列表代表一行。但是,这并不是一直有效,因为有时候没有选择单元格,我收到一条错误消息:'对象引用未设置为对象的实例。'。我想创建一个CustomDataGridCell类,继承自DataGridCell,它有自己的ContextMenu和note字符串。问题是,如何将CustomDataGrid中的所有单元格设为CustomDataGridCell?有更好的方法吗?

这是我当前的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);
    }
}

1 个答案:

答案 0 :(得分: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;
        }
    }
}