首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPF DataGrid Navision功能

WPF DataGrid Navision功能
EN

Stack Overflow用户
提问于 2011-07-19 12:54:50
回答 1查看 824关注 0票数 0

我正在创建一个DataGrid,其功能与Microsoft Dynamic Nav相同。

这几乎就像一个Excel电子表格。

想法是你可以开始编辑一个单元格。在您完成之后,有几个步骤:

  1. 单元格的内容根据列表进行验证。 1.1如果列表包含给定的字符串(不区分大小写),则将DataGrid中的内容替换为列表中的字符串(也称为大小写正确的字符串)。 1.2如果列表不包含字符串,它将显示一个可能出现的新表单,然后使用用户选择的表单来替换已经键入DataGrid的表单。
  2. 如果用户输入了正确的内容或从列表中选择了一个正确的值,那么DataGrid将自动使用预先设置的字符串填充某些列。

如果我们看一个例子:如果用户在第1列中键入z,那么我希望第2列变成"x“,焦点移到colum3

代码语言:javascript
复制
DataGrid: (Before enter/Tab pressed)

[Column1] [Column2] [Column3] [Column4]
[  "a"  ] [  "b"  ] [  "c"  ] [  "d"  ]
[  "z"  ] [       ] [       ] [       ]
(focused)

DataGrid: (Afture enter/tab pressed
[Column1] [Column2] [Column3] [Column4]
[  "a"  ] [  "b"  ] [  "c"  ] [  "d"  ]
[  "z"  ] [  "x"  ] [       ] [       ]
                    (focused)

在这里我遇到了一些问题:

  1. 我使用CellEditEnding事件来验证文本输入。如果找到正确的文本,则在正确的变量处编辑currentItem。但是现在我需要调用dataGrid1.Items.Refresh();,在编辑模式下不能这样做。

MyCode:

FormTest.xaml

代码语言:javascript
复制
...
<DataGrid.Columns>
    <DataGridTextColumn Header="C1" 
        Binding="{Binding c1,UpdateSourceTrigger=LostFocus}"/>
    <DataGridTextColumn Header="C2" 
        Binding="{Binding c2,UpdateSourceTrigger=LostFocus}"/>
    <DataGridTextColumn Header="C3" 
        Binding="{Binding c3,UpdateSourceTrigger=LostFocus}"/>
    <DataGridTextColumn Header="C4" 
        Binding="{Binding c4,UpdateSourceTrigger=LostFocus}"/>
    <DataGridTextColumn Header="C5" 
        Binding="{Binding c5,UpdateSourceTrigger=LostFocus}"/>
</DataGrid.Columns>
...

FormTest.xaml.cs

代码语言:javascript
复制
public FormTest()
{
    InitializeComponent();
    loadMockData();
}
private void loadMockData()
{
    dataItems = new DataItems();
    dataItems.Add(new DataItem() { c1 = "a", c2 = "b", c3 = "c", c4 = "d", c5 = "e" });
    dataItems.Add(new DataItem() { c1 = "a", c2 = "b", c3 = "c", c4 = "d", c5 = "e" });
    dataItems.Add(new DataItem() { c1 = "a", c2 = "b", c3 = "c", c4 = "d", c5 = "e" });
    dataItems.Add(new DataItem() { c1 = "a", c2 = "b", c3 = "c", c4 = "d", c5 = "e" });
    dataItems.Add(new DataItem() { c1 = "a", c2 = "b", c3 = "c", c4 = "d", c5 = "e" });

    dataGrid1.ItemsSource = dataItems;
}
private void dataGrid1_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
{
    TextBox editElement = e.EditingElement as TextBox;
    DataItem di = dataGrid1.CurrentItem as DataItem;
    DataGridCellInfo cell = dataGrid1.CurrentCell;
    if (e.Column.DisplayIndex == 0)
    {
        if (editElement.Text == "z")
        {
            editElement.Text = "Z"; 
            di.c1 = "Z";
            di.c2 = "X";
        }
    }
}
private void dataGrid1_PreviewKeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Enter || e.Key == Key.Tab)
    {
        dataGrid1.CommitEdit();
        DataItem di = dataGrid1.CurrentItem as DataItem;
        dataGrid1.CancelEdit();
        dataGrid1.Items.Refresh();
     }
}

private class DataItems : List<DataItem> { }
private class DataItem
{
    public int recID { get; set; }
    public String c1 { get; set; }
    public String c2 { get; set; }
    public String c3 { get; set; }
    public String c4 { get; set; }
    public String c5 { get; set; }
}

我在这段代码中遇到的问题是:

  1. 在调用刷新后,没有选定的单元格。这意味着如果不使用鼠标选择一个单元格,就不可能继续输入数据。
  2. 当我开始键入一个新项(也称为空行)并按enter或tab键时,dataGrid1.CancelEnding()将删除新项,该行再次为空。

问题

  • 是否可以在不调用ItemSoure的情况下编辑数据集(ItemSoure和显示的内容)的内容?
  • 如果没有,是否可以在完成Items.Refresh()之后设置单元格焦点。?
  • 还是有更好的方法来做这件事?
EN

回答 1

Stack Overflow用户

发布于 2011-07-20 13:19:12

我可以回答你关于更新网格内容的问题。

通常,在更改一个属性之后,不需要刷新整个网格。(如果网格中有大量数据,这也是相当浪费的。)如果您的类DataItem实现了INotifyPropertyChanged接口,并且每次其属性值发生变化时都会触发一个PropertyChanged事件,WPF将自动更新表中的数据。

此页位于MSDN上。包含一个实现此接口的示例,您可以找到一个更完整的使用该接口这里的示例。

这样就消除了使用dataGrid1_PreviewKeyDown事件处理程序的需要,而后者又通过不能向网格底部添加一个新行来解决问题。

您还应该将Mode=TwoWay添加到DataGridTextColumns中的Bindings中,否则,当编辑单元格时,WPF将不会使用在网格中输入的值更新相关的DataItem对象。

在第一列中输入了一个值后,我查看了许多在第二列上“tab”的方法,但是遗憾的是,我没有找到任何有效的方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6747483

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档