我有一个StackPanel
,DataGrid
与DataSet
绑定,Grid
位于DataGrid
底部StackPanel
}}。 Grid
拥有Button
,我希望在用户更改DataAdapter
的内容后用于更新与DataSet
相关联的DataGrid
。
这大部分都按预期工作,但并非总是如此。
我的期望是每当我点击按钮时都会调用eventhandler。如果我更改数据网格中的现有行然后单击按钮,或者如果我在网格的最后(空)行中输入值,则按下回车键,最后单击按钮。如果我在网格的最后一行输入值而不按Enter,则单击该按钮会在数据网格底部生成一个新的(空)行,并且事件处理程序不被调用。只有通过第二次单击它才能调用事件处理程序。为什么是这样?我能改变一下吗?
我的第一个怀疑是DataSet
以某种方式需要了解新数据,但是如果我添加新行,请按Enter并添加第二个新行,然后点击按钮也不会导致通话到事件处理程序,这意味着我的怀疑不解释行为。
这是使用Visual Studio Express 2012
以下是XAML
:
<Window x:Class="AppVer0._01.ProducerWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Producer" Height="300" Width="300">
<StackPanel>
<DataGrid ItemsSource="{Binding producer}"
AutoGenerateColumns="True"
HorizontalAlignment="Left"
Name="producerDataGrid"
/>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="100"/>
</Grid.ColumnDefinitions>
<Button Name="buttonUpdate" Click="buttonUpdate_Click_1">Aktualisieren</Button>
</Grid>
</StackPanel>
</Window>
(我计划添加更多按钮,因此网格中有更多列)后面的代码(对于`Window)定义了绑定,如下所示:
DataSet ds = new DataSet();
// ...
// load data from adapter into dataset
//
this.DataContext = ds;
当然还有定义的事件处理程序。
编辑:如果重要,则将窗口称为对话框。
答案 0 :(得分:1)
我认为您应该检查并查看DataGrid是否处于编辑模式。
在dataGrid中处理这两个事件:BeginningEdit和CellEditEnding(或者在你的情况下RowEditEnding)
定义此属性public bool IsInEditMode;
和:
void dg_BeginningEdit(object sender, BeginningEditEventArgs e)
{
IsInEditMode=true;
}
void dg_CellEditEnding(object sender, CellEditEndingEventArgs e)
{
IsInEditMode=false;
}
现在,您可以确定何时处于编辑模式,按下按钮的时间:
void buttonUpdate_Click_1(...)
{
if (IsInEditMode)
{
producerDataGrid.CommitEdit();
}
}
请参阅CommitEdit方法。我们称之为结束编辑。
答案 1 :(得分:0)
我想出了如何在this MS page的文章的帮助下改变我所描述的行为。我在按钮的MouseDownEvent中添加了一个处理程序,即使e.Handled
属性设置为true,也会调用该处理程序,如下所示:
buttonUpdate.AddHandler(UIElement.MouseDownEvent,
(RoutedEventHandler)buttonUpdate_ClickAlwaysCalled, true);
最后的true
完成了这个技巧,并且在XAML中分配的处理程序现在根本没有调用langer(所以新的处理程序似乎首先被调用,并以某种方式神奇地设置{{1到event.Handled
,但我不知道我是否可以依赖它。由于调用更新函数两次没有坏处,这对我来说没问题)。我不确定这是否是一种很好的方法,但确实有效。