2011-06-22 9 views
1

私はVisual InterfaceでC#で書いています。ロジックの一部は、コンボボックスでどれが選択されたかに応じて変化する一連の値で構成されます。どのようにコンボボックスの値の変更プロセスが中断することができますか?

値セットの変更を保存するかどうかを指定できます。コンボボックスで別のアイテム(セット)を選択すると、保存されていない変更を保存したり、拒否したりする機会をユーザに提供する必要があります。 yes/noのメッセージボックスにコンボボックスが表示されても、以前の値が表示され、その後にのみ、ユーザーの選択に応じて新規または古いメッセージが表示されることが不可欠です。

シーケンスは次のようになります。

ユーザーが新しい項目を選択するには、キーを使用するか、またはドロップダウンを - >イベントが発生し、フォームがその処理のすべてを停止している - >私のコードは、変更をキャンセルしたり、それが通過することができます - > (取り消されていない場合)コンボボックスが新しい値で再描画されます。

N.B.次のイベントは、試してみました、適切なていないことが判明した。

  • をのSelectedIndexChanged
  • をSelectedValueChanged
  • を検証
  • をSelectionChangeCommitted私は、これはあなたが後にあるかと思い
+0

私は自分の仕事までではないことが判明した処理を試みたイベントを挙げました。私はそれらを再リストすることができる、確かに。 – Srv19

+0

ドロップダウンで項目を選択/選択した後、保存するかどうかを尋ねるメッセージボックスが表示されるようにしますか?私はあなたが物事を望む秩序についてはまだ不明です。 – Taryn

+0

あなたは正しいです。ここで重要なのは、メッセージボックスが表示されたときに、保存するように提案されているアイテムが表示されていたことです。 – Srv19

答えて

1

質問の質問に直接対応していませんが、私は幾分許容できる解決策を見つけました。

しかし、悲しいことに、何らかの理由で彼の提案者によって削除された可能性のある解決策は、メッセージフィルタを使用することでした。しかし、これはマウスクリックがどこで行われたのかを手作業で計算し、マウスイベントをコンボボックスのドロップリストで選択した項目を自分で変更するプロセスにマウスイベントを変換するwinforms機能に本質的に置き換えられました。これが私が黙っていた道です。

最終的に私は、コンセプトボックスに表示されているテキストを、その変更をキャンセルするかどうかの主題に関するユーザーの意思決定の間、置換されたアイデアで「化粧品」ソリューションに解決しました。

ので、SelectedIndexChangedイベントで、私はfollofingコードを入れている:

try 
{ 
    if (MyDataSets.Current.HasChanges() && !MyDataSets.Current.Name.Equals(cbChosenDataSet.Value)) 
    { 
     cbChosenDataSet.DropDownStyle = ComboBoxStyle.DropDown; 
     cbChosenDataSet.Text = MyDataSets.Current.Name + ' '; 
     Application.DoEvents(); 
    } 
    else return; 
    /* 
    * UserChoseToCancel is set according to user's choice 
    */ 
    if (UserChoseToCancel) 
     cbChosenDataSet.Value = MyDataSets.Current.Name; 
    else 
     MyDataSets.SetCurrent(cbChosenDataSet.Value); 
    /* 
    * other things 
    */ 
} 
catch(Exception e) {/* handling */} 
finally 
{ 
    cbChosenDataSet.DropDownStyle = ComboBoxStyle.DropDownList; 
} 

アイデアの要旨はこれです:必要に応じて、ドロップダウンスタイルでコンボボックス」のテキストを変更することができます。ただし、リスト内のいずれかの項目に設定すると、選択が変更されます。不要にするのを避けるために、一時テキストにスペースが追加されます。

取り消しが発生しない場合、スタイルをDropDownListに復元すると、実際に選択された値(同じままである)にテキストが強制的に変更されます。

ユーザーが変更をキャンセルした場合、コンボボックスの値は古いものに戻されます。ハンドラの先頭にあるチェックは、それによって生成されたイベントをさらに処理しないようにします。

1

をDropDownClosed - いつでも値が変更され、ユーザーにはOK/Cancelが表示されます。これの唯一の制限は、メッセージボックスが表示されている間、ユーザーが[キャンセル]をクリックするまで、コンボボックスに新しい値が表示されることです。おそらく、ペイントメッセージを傍受して、これを防ぐことができます。

class MyCombo : ComboBox 
    { 
     // Keep track of the previous value 
     int previousIndex = 0; 

     // Determines whether the OnSelectedIndexChanged is ignored 
     bool ignoreChangedEvent = false; 

     /// <summary> 
     /// Raises the <see cref="E:System.Windows.Forms.ComboBox.SelectedIndexChanged"/> event. 
     /// </summary> 
     /// <param name="e">An <see cref="T:System.EventArgs"/> that contains the event data.</param> 
     protected override void OnSelectedIndexChanged(EventArgs e) 
     { 
      if (!ignoreChangedEvent) 
      { 
       // Prompt the user to see if they really want to change. 
       if (MessageBox.Show("Change value?", Application.ProductName, MessageBoxButtons.OKCancel) == DialogResult.Cancel) 
       { 
        ignoreChangedEvent = true; 
        base.SelectedIndex = previousIndex; 
       } 
       else 
       { 
        previousIndex = base.SelectedIndex; 
       } 
      } 
      else 
      { 
       ignoreChangedEvent = false; 
      } 

      base.OnSelectedIndexChanged(e); 
     } 
    } 
+0

これはいいです、 'C&P'と適応します:) – Sebastian

関連する問題