1

我有一个StackPanel与 aDataGrid绑定的 aDataSet和一个GridDataGrid底部底部的a StackPanel。在Grid用户更改. Button_ DataAdapter_DataSetDataGrid

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

我的期望是每当我单击按钮时都会调用事件处理程序。如果我更改数据网格中的现有行然后单击按钮,或者如果我在网格的最后(空)行中输入值,然后按 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;

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

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

4

2 回答 2

1

我认为您应该检查 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方法。我们称之为结束编辑。

于 2012-12-25T14:51:19.797 回答
0

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

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

最后true的伎俩,已经在 XAML 中分配的处理程序现在根本没有被调用(所以新的处理程序似乎首先被调用并且以某种方式神奇地设置event.Handledtrue,但我不知道我是否可以依靠这个。由于两次调用更新函数没有害处,这对我来说很好)。我不确定这是否是这样做的好方法,但它确实有效。

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

于 2012-12-25T16:19:07.473 回答