数据网格和按钮:单击未调用的事件处理程序
本文关键字:调用 事件处理 程序 单击 数据网 网格 按钮 数据 | 更新日期: 2023-09-27 17:49:24
我有一个StackPanel
,其中DataGrid
与DataSet
结合在一起,StackPanel
底部的DataGrid
下方有一个Grid
。Grid
持有一个Button
,我想在用户更改DataGrid
的内容后,用它来更新与DataSet
关联的DataAdapter
。
大多数情况下都能按预期工作,但并非总是如此。
我的期望是每当我单击按钮时调用事件处理程序。如果我更改数据网格中的现有行,然后单击按钮,或者如果我在网格的最后一行(空)中输入值,然后按enter键并最后单击按钮,则此操作有效。如果我在网格的最后一行输入值并且没有按enter键,则单击该按钮会在数据网格的底部产生一个新的(空)行,并且调用eventandler 而不是。只有在第二次调用事件处理程序时单击它。为什么会这样?我可以换吗?
我的第一个怀疑是DataSet
在某种程度上需要被告知新的数据,但是如果我添加一个新的行,按下回车键并添加第二个新行,那么按钮点击也不会导致调用事件处理程序,这意味着我的怀疑不能解释行为。
使用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;
,当然,这里定义了事件处理程序
编辑:在这种情况下,窗口被称为一个对话框
我想你应该检查一下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方法。我们叫它结束编辑
我在这个微软页面上的一篇文章的帮助下想出了如何改变我所描述的行为。我为按钮的MouseDownEvent添加了一个处理程序,即使e.Handled
属性被设置为true也会被调用,如下所示:
buttonUpdate.AddHandler(UIElement.MouseDownEvent,
(RoutedEventHandler)buttonUpdate_ClickAlwaysCalled, true);
最后的true
做到了这一点,并且在XAML中分配的处理程序现在根本不再被调用(因此新的处理程序似乎首先被调用,并以某种方式神奇地将event.Handled
设置为true
,但我不知道我是否可以依赖于此。因为调用更新函数两次没有害处(这对我来说很好)。我不确定这是不是一个好方法,但它确实有效。