1

の下部ににバインドさStackPanelDataGridDataSetとがあります。ユーザーがのコンテンツを変更した後、に関連付けられたを更新するために使用したいを保持します。GridDataGridStackPanelGridButtonDataAdapterDataSetDataGrid

これはほとんど期待どおりに機能しますが、常に機能するとは限りません。

私の期待は、ボタンをクリックするたびにイベントハンドラーが呼び出されることです。これは、データグリッドの既存の行を変更してボタンをクリックするか、グリッドの最後の(空の)行に値を入力してEnterキーを押し、最後にボタンをクリックした場合に機能します。グリッドの最後の行に値を入力し、Enterキーを押さない場合、ボタンをクリックすると、データグリッドの下部に新しい(空の)行が表示され、イベントハンドラーは呼び出されません。もう一度クリックするだけで、イベントハンドラーが呼び出されます。どうしてこれなの?これを変更できますか?

私の最初の疑いは、DataSetどういうわけか新しいデータについて通知する必要があるということでしたが、新しい行を追加し、Enterキーを押して、2番目の新しい行を追加すると、ボタンをクリックしてもイベントハンドラーが呼び出されません。私の疑惑はその行動を説明していません。

これはVisualStudioExpress2012を使用しています

これが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が編集モードになっているかどうかを確認する必要があると思います。

dataGridで次の2つのイベントを処理します: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ページの記事を参考にして、説明した動作を変更する方法を見つけました。e.Handled次のように、属性がtrueに設定されている場合でも呼び出されるボタンのMouseDownEventにハンドラーを追加しました。

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

最後にtrueatがトリックを実行し、XAMLで割り当てられたハンドラーは、ランガーがまったく呼び出されなくなります(したがって、新しいハンドラーが最初に呼び出され、どういうわけか魔法のようにに設定event.Handledされるようtrueですが、できるかどうかはわかりませんこれに依存します。更新関数を2回呼び出しても害はないので、これは私にとっては問題ありません)。これがこれを行うための良い方法であるかどうかはわかりませんが、機能します。

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

于 2012-12-25T16:19:07.473 に答える