DataGrid和button:未调用click的事件处理程序

时间:2012-12-25 11:21:35

标签: c# wpf xaml click wpfdatagrid

我有一个StackPanelDataGridDataSet绑定,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;

当然还有定义的事件处理程序。

编辑:如果重要,则将窗口称为对话框。

2 个答案:

答案 0 :(得分:1)

我认为您应该检查并查看DataGrid是否处于编辑模式。

在dataGrid中处理这两个事件:BeginningEditCellEditEnding(或者在你的情况下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,但我不知道我是否可以依赖它。由于调用更新函数两次没有坏处,这对我来说没问题)。我不确定这是否是一种很好的方法,但确实有效。

http://msdn.microsoft.com/en-us/magazine/cc785480.aspx