2011-06-22 22 views
1

我寫在C#與可視化界面。部分邏輯包含一組值,這取決於組合框中哪一個(組)被選中。組合框值更改過程如何中斷?

變化值設置可以保存與否。當他在組合框中選擇不同的項目(集合)時,需要爲用戶提供保存未保存的更改或拒絕他們的機會。當顯示組合框的「是/否」組合框仍然顯示舊值時,並且僅在此之後,取決於用戶選擇顯示新還是舊。

的順序應該是:

用戶使用按鍵或下拉選擇新項目 - >事件被觸發,形式停止其所有的處理 - >我的代碼取消變化或讓它經歷 - > (如果未取消)組合框將重新繪製新值。

N.B.以下事件被審判,被證明不是足夠:

  • 的SelectedIndexChanged
  • SelectedValueChanged
  • SelectionChangeCommitted
  • 驗證
  • DropDownClosed
+0

我列出了我嘗試處理的事件,事實證明這些事件不符合他們的工作。當然,我可以重新列出它們。 – Srv19

+0

當他們在下拉菜單中鍵入/選擇一個項目後,是否希望他們收到一個消息框,詢問他們是否要保存它?我仍然不清楚你想要的東西的順序。 – Taryn

+0

你是對的。這裏最重要的是當消息框顯示時,他們被建議保存的項目仍然顯示。 – Srv19

回答

1

我發現有些可接受的解決方案,雖然沒有直接對應的設問的verbatium。

一個可能的解決方案,但遺憾的是,由於某種原因,他建議器中刪除,是使用消息過濾器。然而,這導致了人工計算,其中鼠標點擊去,基本上取代翻譯鼠標事件與我自己的一些粗俗的柺杖組合框的下降列表改變所選項目的過程中的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

我想這是你所追求的 - 只要該值將被改變,提示用戶確定/取消。唯一的限制是組合框在顯示消息框時顯示新值,直到用戶單擊取消。也許通過攔截油漆消息你可以防止這種情況。

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

相關問題