【问题标题】:DataGrid and button: event handler for click not calledDataGrid 和按钮:未调用单击的事件处理程序
【发布时间】:2012-12-25 11:21:34
【问题描述】:

我有一个StackPanel,其中DataGrid 绑定到DataSetGrid 位于StackPanel 底部的DataGrid 下方。 Grid 包含一个Button,在用户更改DataGrid 的内容后,我想用它来更新与DataSet 关联的DataAdapter

这主要按预期工作,但并非总是如此。

我的期望是每当我单击按钮时都会调用事件处理程序。如果我更改数据网格中的现有行然后单击按钮,或者如果我在网格的最后(空)行中输入值,然后按 enter 并最后单击按钮,这确实有效。如果我在网格的最后一行输入值并且不按 Enter,则单击该按钮会在数据网格的底部产生一个新的(空)行,并且事件处理程序被 not 调用。仅通过再次单击它来调用事件处理程序。为什么是这样?我可以更改吗?

我的第一个怀疑是 DataSetsomehow 需要被告知新数据,但如果我添加一个新行,按 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;

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

编辑:在重要的情况下,窗口被称为对话框。

【问题讨论】:

    标签: c# wpf xaml click wpfdatagrid


    【解决方案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 方法。我们称之为结束编辑。

    【讨论】:

    • 谢谢。虽然这并不能解决问题(按钮单击处理程序仍未输入),但它确实对此有所了解。如果数据网格处于编辑模式,按钮单击事件似乎会丢失,但似乎会以某种方式产生 RowEditEnding 事件。因此,您为按钮单击处理程序建议的编码永远不会执行。是否有一些在点击事件之前触发的按钮事件,我可以添加该代码?
    • @Thomas 也许您可以处理按钮的 PreviewMouseButtonDown ,在这种情况下,请致电:if (IsInEditMode){ producerDataGrid.CommitEdit(); }
    • 我也试了一下,但是在我描述的情况下也没有调用 PreviewMouseButtonDown 事件处理程序。不过,我投了赞成票,因为您带领我走上了一条有帮助的道路,谢谢。
    【解决方案2】:

    this MS page 上的一篇文章的帮助下,我想出了如何改变我所描述的行为。我在按钮的 MouseDownEvent 中添加了一个处理程序,即使 e.Handled 属性设置为 true,也会调用该处理程序,如下所示:

    buttonUpdate.AddHandler(UIElement.MouseDownEvent,
            (RoutedEventHandler)buttonUpdate_ClickAlwaysCalled, true);
    

    最后的 true 可以解决问题,并且在 XAML 中分配的处理程序现在根本没有调用 langer(因此新的处理程序似乎首先被调用,并且以某种方式神奇地将 event.Handled 设置为 @ 987654327@,但我不知道我是否可以依赖这个。因为调用更新函数两次没有坏处,这对我来说很好)。我不确定这是否是一种好方法,但它确实有效。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-15
      • 1970-01-01
      • 2010-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-20
      相关资源
      最近更新 更多