2009-04-23 36 views
3

我有一個有製造商列表的組合框。當用戶選擇製造商時,下面的網格會填充所選製造商的數據。該數據可以修改。用戶必須在完成所有更改後按下保存按鈕。如何處理ComboBox選擇的索引更改?

但用戶可以忘記按保存並從ComboBox中選擇另一個製造商,網格將填充另一個數據,因此以前的更改將會丟失。

所以我需要問用戶他是否想在選擇另一個製造商之前保存更改。

我該怎麼做?或者,也許你提供瞭解決我的任務的另一種方式(從另一個角度來看)?

回答

3

您應該處理ComboBox.SelectedIndexChanged事件。喜歡的東西:

this.ComboBox1.SelectedIndexChanged += new system.EventHandler(ComboBox1_SelectedIndexChanged); 

然後,每當它改變,你可以更新該功能的製造商信息ComboBox1_SelectedIndexChanged()將被調用。在填充新信息之前保存舊信息。或者在保存之前提示用戶是否真的想要更改它。

+3

任何像e.Cancel爲組合框選擇變化? – IsmailS 2010-04-30 14:31:16

-2

ComboBox提供了一個名爲SelectedIndexChanged的事件。無論何時PropertyIndexIndex發生變化,此事件都會引發,因此您必須處理該事件,以便每當用戶想要更改組合索引時,如果用戶未保存更改,請他這樣做。

0

如果您想知道如何在選擇更改時收到通知,則可以訂閱ComboBox.SelectedIndexChanged事件。

如果您想要爲用戶提供保存選項,只有當某些內容發生變化並且她忘記保存更改時,您需要跟蹤這些其他字段何時更改。這可以通過在用戶編輯任何字段時保持布爾值被設置爲true來完成。發生上述事件時,請在決定是否提供保存選項之前檢查該值。

0

在這裏做的最好的事情是比較已儲存(在任何 - 在DataSet,列表對象等)在ComboBox(同樣與其他領域)輸入的數據,並檢查是否有任何差異。這樣,如果用戶從ComboBox中選擇另一個項目,但然後將其更改回原始項目,則程序會識別出數據仍有而不是已被修改。 (例如,處理SelectionChangeCommited事件,並將布爾值設置爲true,將不會允許檢測到這種情況,並且實施起來也會稍微困難一些。)在這種情況下,最簡單最優雅的方法似乎也可以提供最好的功能。

9

下面是我們如何可以繼承的ComboBox推出新SelectedIndexChangingEvent的可能性,以抵消變化:

public class ComboBoxEx : ComboBox 
{ 
    public event CancelEventHandler SelectedIndexChanging; 

    [Browsable(false)] 
    public int LastAcceptedSelectedIndex { get; private set; } 

    public ComboBoxEx() 
    { 
     LastAcceptedSelectedIndex = -1; 
    } 

    protected void OnSelectedIndexChanging(CancelEventArgs e) 
    { 
     var selectedIndexChanging = SelectedIndexChanging; 
     if (selectedIndexChanging != null) 
      selectedIndexChanging(this, e); 
    } 


    protected override void OnSelectedIndexChanged(EventArgs e) 
    { 
     if (LastAcceptedSelectedIndex != SelectedIndex) 
     { 
      var cancelEventArgs = new CancelEventArgs(); 
      OnSelectedIndexChanging(cancelEventArgs); 

      if (!cancelEventArgs.Cancel) 
      { 
       LastAcceptedSelectedIndex = SelectedIndex; 
       base.OnSelectedIndexChanged(e); 
      } 
      else 
       SelectedIndex = LastAcceptedSelectedIndex; 
     } 
    } 

} 
+0

^**這是實際的答案。** – CodeAngry 2014-12-19 15:54:43

0

偉大的工作nightcoder。你的代碼完美地工作。

謝謝!

對於誰在VB.NET寫開發商在這裏你有翻譯:

Imports System.ComponentModel 

Public Class ComboBoxEx 
    Inherits ComboBox 

    Private pLastAcceptedSelectedIndex As Integer 

    Public Event SelectedIndexChanging As CancelEventHandler 

    Public Property LastAcceptedSelectedIndex() As Integer 
    Get 
     Return pLastAcceptedSelectedIndex 
    End Get 
    Set(ByVal value As Integer) 
     pLastAcceptedSelectedIndex = value 
    End Set 
    End Property 

    Public Sub New() 
    LastAcceptedSelectedIndex = -1 
    End Sub 

    Protected Sub OnSelectedIndexChanging(ByVal e As CancelEventArgs) 
    RaiseEvent SelectedIndexChanging(Me, e) 
    End Sub 

    Protected Overrides Sub OnSelectedIndexChanged(ByVal e As System.EventArgs) 
    If LastAcceptedSelectedIndex <> SelectedIndex Then 
     Dim cancelEventArgs As CancelEventArgs 

     cancelEventArgs = New CancelEventArgs() 
     OnSelectedIndexChanging(cancelEventArgs) 

     If Not cancelEventArgs.Cancel Then 
     LastAcceptedSelectedIndex = SelectedIndex 
     MyBase.OnSelectedIndexChanged(e) 
     Else 
     SelectedIndex = LastAcceptedSelectedIndex 
     End If 
    End If 
    End Sub 
End Class 
1

夜編碼器的解決方案是優雅而簡潔。我已經將它打包在一個dll中。
(我稱之爲CustomControls)。爲此,創建一個新的類庫,並將前幾個語句添加到Night Coder的解決方案(作爲便利複製到此處)。

編譯完代碼後,可以將其添加爲參考。我實際上將DLL加載到我的Visual Studio工具窗格中。這樣我可以在設計時將控件拖到我的表單上。方便的是,新的事件顯示在屬性列表中。

use System.ComponentModel; 

use System.Windows.Forms; //this will need to be added as a reference 

//your namespace will name your dll call it what you will 

namespace CustomControls 

夜編碼器的解決方案如下:

public class ComboBoxEx : ComboBox 
{ 
     public event CancelEventHandler SelectedIndexChanging; 


    [Browsable(false)] 
    public int LastAcceptedSelectedIndex { get; private set; } 

    public ComboBoxEx() 
    { 
      LastAcceptedSelectedIndex = -1; 
    } 

    protected void OnSelectedIndexChanging(CancelEventArgs e) 
    { 
      var selectedIndexChanging = SelectedIndexChanging; 
      if (selectedIndexChanging != null) 
        selectedIndexChanging(this, e); 
    } 


    protected override void OnSelectedIndexChanged(EventArgs e) 
    { 
      if (LastAcceptedSelectedIndex != SelectedIndex) 
      { 
        var cancelEventArgs = new CancelEventArgs(); 
        OnSelectedIndexChanging(cancelEventArgs); 

        if (!cancelEventArgs.Cancel) 
        { 
          LastAcceptedSelectedIndex = SelectedIndex; 
          base.OnSelectedIndexChanged(e); 
        } 
        else 
          SelectedIndex = LastAcceptedSelectedIndex; 
      } 
    } 
} 
4

創建2級水平的變量

private bool selectionCancelled=false; 
private int lastSelectedIndex=-1; 

然後在SelectedIndex的事件中,你可以編寫代碼如下

 if (!selectionCancelled) 
     { 
      if (MessageBox.Show("Are you sure you want to change the selection ?", this.Text, MessageBoxButtons.YesNo) == System.Windows.Forms.DialogResult.No) 
      { 
       selectionCancelled = true; 
       comboBox.SelectedIndex = lastSelectedIndex; 
       return; 
      } 

      lastSelectedIndex = comboBox.SelectedIndex; 
      // Normal code of the event handler 

     } 
     else 
     { 

      selectionCancelled = false; 
     } 
+0

自.NET Framework 2.0開始工作真的很好,很簡單,謝謝!我剛剛增加了在程序設計上避免使用messagebox的可能性 – 56ka 2013-11-15 16:25:09

1

一個簡單保持t的方法未保存更改的機架。

加載任何原始值後,禁用「保存」按鈕。

當用戶試圖離開時,檢查是否啓用了「保存」按鈕。

根據需要啓用或禁用「保存」按鈕。

1

我知道這是一個較老的問題,但我想我會添加我使用的方法。我不確定它是否更好。應該有IndexChanging事件或可以取消的常規ComboBox中的某個事件。

該解決方案是@ AftabAhmedKalhoro's和@ jeffamaphone的帖子的結合,但使用Tag屬性代替。

我不想子類ComboBox,或有任何額外的私有變量浮動在窗體周圍。但有些人可能不喜歡Tag屬性,因爲如果你不習慣使用它,那麼它就是隱藏的(從VB6中遺留下來的)。

Private Sub MainForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
    ComboBox1.Items.Add("Item1") 
    ComboBox1.Items.Add("Item2") 
    ComboBox1.Items.Add("Item3") 
    ComboBox1.Items.Add("Item4") 
    ' Load Value from database or whatever and set the value or index. 
    ComboBox1.SelectedIndex = 0 
    ComboBox1.Tag = ComboBox1.SelectedIndex 

    ' I add the handler at the end because I don't want it to fire during loading the form. 
    AddHandler ComboBox1.SelectedIndexChanged, New EventHandler(AddressOf ComboBox1_SelectedIndexChanged) 
End Sub 

Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) 
    If (ComboBox1.Tag <> ComboBox1.SelectedIndex) Then 
     If MessageBox.Show("Warning! You are changing the index." & vbCrLf & _ 
          "Do you wish to continue?", _ 
          "Changing Index", _ 
          MessageBoxButtons.YesNo, _ 
          MessageBoxIcon.Warning) = Windows.Forms.DialogResult.Yes Then 
      ComboBox1.Tag = ComboBox1.SelectedIndex 
      ' Do Something. 
     Else 
      ComboBox1.SelectedIndex = ComboBox1.Tag 
     End If 
    End If 
End Sub 

注意復位SelectedIndex將導致事件在此行中再次觸發:

ComboBox1.SelectedIndex = ComboBox1.Tag 
相關問題