加载应用程序后DataGrid为空

本文关键字:为空 DataGrid 应用程序 加载 | 更新日期: 2023-09-27 18:28:24

我有一个包含数据库表信息的DataGrid(如果重要的话可以访问)。

到目前为止,我对数据库有着完美的数据网格工作,但有按钮(显示、添加、删除和编辑),但现在,我想删除按钮,只使用数据网格来完成所有这些功能。

当我在不点击的情况下执行显示按钮时(当wpf加载时自动),它会显示数据表,但当我尝试设置头列时,它会向我显示DataGrid为null(当These DataGrid显示数据库中具有正确信息的表时)。我想在这个问题上得到帮助。谢谢。

代码:

try
{
    DataBaseIkuns.Instance.OpenConnectionWithDB();
    DataBaseIkuns.Instance.LoadDataFromDB(DictionaryUtilsDB.dictioneary[DictionaryUtilsDB.CommendTypes.ShowIkuns]);
    dataGridIkuns.ItemsSource = DataBaseIkuns.Instance.dt.DefaultView;
    // ---------------------- Until here it work's perfect - loading the table from the data base with the origin header column 
    DataBaseIkuns.Instance.SetNameOnHeaderColumn(dataGridIkuns); // here it fall.
    DataBaseIkuns.Instance.CloseConnectionWithDB();
}
catch (Exception ex)
{
    System.Windows.Forms.MessageBox.Show(ex.ToString());
}
internal void SetNameOnHeaderColumn(Microsoft.Windows.Controls.DataGrid dataGridIkuns)
{
    dataGridIkuns.Columns[0].Header = "x"; // Fall because DataGridIkuns colomn count is 0.
    dataGridIkuns.Columns[1].Header = "y";
}

错误:索引超出范围。必须是非负数并且小于集合参数名称的大小:索引

当我点击"显示"按钮时,它确实起到了这个作用,而且它的工作非常完美。但当我这样做时,wpf应用程序加载错误。为什么?

顺便说一句,另一个问题是,如果有人知道dataGrid的工作指南(添加、删除和编辑),没有按钮,只有键盘编辑),我会很高兴得到它。

加载应用程序后DataGrid为空

如果让网格为您自动生成列,那么很可能这些列还没有填充。列自动填充不一定在设置ItemsSource时立即发生;它可能会被推迟,因为网格从未被测量过,或者因为它还没有数据项。

您可以尝试将对SetNameOnHeaderColumn的调用推迟到稍后,方法是使用BeginInvokeDispatcherPriority.Loaded:在Dispatcher上进行调度

try
{
    DataBaseIkuns.Instance.OpenConnectionWithDB();
    DataBaseIkuns.Instance.LoadDataFromDB(/* ... */);
    var view = DataBaseIkuns.Instance.dt.DefaultView;
    dataGridIkuns.ItemsSource = view;
    dataGridIkuns.Dispatcher.BeginInvoke(
        DispatcherPriority.Loaded,
        new Action(
            () =>
            {
                if (dataGridIkuns.ItemsSource == view)
                    SetNameOnHeaderColumn(dataGridIkuns);
            }));
    DataBaseIkuns.Instance.CloseConnectionWithDB();
}
catch (Exception ex)
{
    System.Windows.Forms.MessageBox.Show(ex.ToString());
}

既然你问了,这里有一些标准的快捷方式应该与DataGrid:一起使用

  • Tab/Shift+Tab-转到当前行上的下一个/prev单元格,或换行到下一个/prev行
  • Left/Right-仅转到当前行的上一个/下一个单元格
  • Up/Down-转到上一行/下一行
  • F2-编辑所选单元格
  • F4-打开单元格编辑器下拉列表(编辑一次,如果适用)
  • Esc-取消编辑
  • Del-删除当前行(不编辑单元格时)
  • Home/End-跳转到行中的第一个/最后一个单元格
  • Ctrl+Home/Ctrl+End-跳转到网格中的第一行/最后一行
  • PgUp/PgDn-在视图中向上/向下跳一个"页面"
  • Enter/Shift+Enter-如果正在编辑,则提交当前单元格,然后跳到下一行/上一行中的同一列

我不知道有任何插入新行或跳转到新行占位符的快捷方式。