我正在创建一个DataGrid,其功能与Microsoft Dynamic Nav相同。
这几乎就像一个Excel电子表格。
想法是你可以开始编辑一个单元格。在您完成之后,有几个步骤:
如果我们看一个例子:如果用户在第1列中键入z,那么我希望第2列变成"x“,焦点移到colum3
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)在这里我遇到了一些问题:
CellEditEnding事件来验证文本输入。如果找到正确的文本,则在正确的变量处编辑currentItem。但是现在我需要调用dataGrid1.Items.Refresh();,在编辑模式下不能这样做。MyCode:
FormTest.xaml
...
<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
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; }
}我在这段代码中遇到的问题是:
dataGrid1.CancelEnding()将删除新项,该行再次为空。问题
ItemSoure的情况下编辑数据集(ItemSoure和显示的内容)的内容?Items.Refresh()之后设置单元格焦点。?发布于 2011-07-20 13:19:12
我可以回答你关于更新网格内容的问题。
通常,在更改一个属性之后,不需要刷新整个网格。(如果网格中有大量数据,这也是相当浪费的。)如果您的类DataItem实现了INotifyPropertyChanged接口,并且每次其属性值发生变化时都会触发一个PropertyChanged事件,WPF将自动更新表中的数据。
此页位于MSDN上。包含一个实现此接口的示例,您可以找到一个更完整的使用该接口这里的示例。
这样就消除了使用dataGrid1_PreviewKeyDown事件处理程序的需要,而后者又通过不能向网格底部添加一个新行来解决问题。
您还应该将Mode=TwoWay添加到DataGridTextColumns中的Bindings中,否则,当编辑单元格时,WPF将不会使用在网格中输入的值更新相关的DataItem对象。
在第一列中输入了一个值后,我查看了许多在第二列上“tab”的方法,但是遗憾的是,我没有找到任何有效的方法。
https://stackoverflow.com/questions/6747483
复制相似问题