2017-08-18 6 views
1

私はdatagradviewを使用しています。移動する前に現在の行を保存するようにユーザーに求めています。次のイベントを使用しようとしていましたが、私はセーブイベントに当たった。選択を使用するときの循環ループ

private void dgStock_SelectionChanged(object sender, EventArgs e) 
{ 
     if (isDirty == true) 
     { 
      isSavedFromRow = true; 
      btnSaveDetails_Click(sender, e); 

      isDirty = false; 
     } 
} 

選択変更イベントでの問題は、行は、ユーザーが自分の新しい行ではなく、現在の行を保存考えることができるように変更された後にこの問題が発生しています。

私も円形ループに巻き込まれているようですが、メッセージボックスが何回も消えてしまっているのですか?ユーザーがテキストボックスにキーを押したときにisDirtyをtrueに設定するだけです。

if (isDirty == true) 
{ 
      DialogResult _result = MessageBox.Show("Are you sure you wish to upate Live Product Information", "Save Changes", MessageBoxButtons.YesNo, MessageBoxIcon.Information); 
      if (_result == DialogResult.Yes) 
      { 
       updateStock(); 
       _trackChanges.Clear(); 

       isDirty = false; 
      } 
} 

これはキーダウン時に私の汚れた旗をセットしているので、これは私のような問題を避けるための最良の方法だと感じました。

private void txtDescription_KeyDown(object sender, KeyEventArgs e) 
{ 
     isDirty = true; 
     btnSaveDetails.Enabled = true; 
} 

答えて

0

コードサンプルには、保存ボタンがクリックで定義されていることが示されています。構造をこのようなものに変更した場合

private void SaveClick(object sender, EventArgs e) 
{ 
    DoSaveStuff(); 
} 

private void DoSaveStuff() 
{ 
    // Do your save stuff 
} 

つまり、保存したデータをメソッドにプルします。保存する必要がある場合はいつでもDoSaveStuff()に電話することができます。

private void SelectionChanged(object sender, EventArgs e) 
{ 
    // Do stuff 

    if (condition) 
    { 
     DoSaveStuff(); 
    } 
} 

このアプローチの利点は、ボタン全体のクリックではなく、あなたが興味を持っている動作の側面をキャプチャしていることです。さらに、保存するためにボタンをクリックすると、アプリケーションではなく、単に特定の状況で保存されます。ボタンをクリックするか何かが変わったとき。

MSDNは、選択が変更されたときはいつでもSelectionChangedEventが発生すると言います。だから、これが起きたときはいつでも元の選択をチェックして変更があったかどうかを確認し、もしあればそれを保存することができます。多分これ

private void SelectionChanged(object sender, EventArgs e) 
{ 
    bool hasContentsChanged = // determine if your content has changed 

    if (hasContentsChanged) 
    { 
     DoSaveStuff(); 
    } 
} 

このアプローチの利点のような何かをすることはあなただけそれは本当に、すなわち、元のテキストであれば!=新しいテキストではなく、すべての場合には、変更された場合は、保存する必要があるだろうということです。

関連する問題