簡體   English   中英

在組合框中選擇枚舉作為SelectedItem

[英]selecting enum as SelectedItem in combobox

我在選擇winforms組合框中的適當項目時遇到了困難。 以前我在這里詳細描述過,但是我認為問題仍然沒有解決,因為我使用一種形式進行添加/編輯記錄。 所以我有表格加載

  private void AddEditForm_Load(object sender, EventArgs e)
  {
      PopulateComboBoxLanguage();
  }

private void PopulateComboBoxLanguage()
{
    comboBoxLang.DataSource = Enum.GetValues(typeof(Book.EnumLang));
}

在執行編輯操作時,我想用現有數據填充表單,並按應有的方式填充所有內容,但組合框始終顯示EnumLang的第一項。 從第二個構造函數中,我在其中使用PopulateWithExisingData(book)

comboBoxLang.SelectedItem = book.Language;

但是即使在通過book.Language設置為German SelectedItem情況下,在調試模式下也始終為null。

ps我嘗試了comboBoxLang.SelectedItem = (book.EnumLang)book.Language; 也與SelectedValue相同,但保持不變。

我再一次猜想問題出在頁面加載時填充組合框,但我不知道是什么以及如何解決。

請詢問更多信息。

  1. 聲明要在表單中添加/編輯的對象類型的實例。
  2. 將bool isEdit添加到表單並將其設置為false
  3. 添加方法public void Initialize(ObjectType name)
  4. 您的Initialize方法應將表單實例設置為與參數相等,並且應設置一個布爾標志isEdit = true。
  5. 將所有加載數據/填充控件的代碼(如組合框)放入表單加載事件中。
  6. 在加載事件的底部,填充控件后,執行

      if (isEdit) { //Set your controls selected values from the object you are editing } 

現在,對於新對象,只需創建表單並在其上調用Show或ShowDialog。 這將引發Load事件,並填充您的控件。

要進行編輯,請創建表單,調用Initialize,然后執行Show / ShowDialog。 由於您的Initialize方法設置為isEdit = true,因此將加載事件底部的if(isEdit)代碼塊,並且控件值將設置為與正在編輯的對象的屬性相等。

這是一些非常簡單的示例代碼:

    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        //This is simulating an add...First Language will be displayed on form2, 
        //which is English
        Form2 form = new Form2();
        form.ShowDialog();
    }

    private void button2_Click(object sender, EventArgs e)
    {
        //This is simulating an edit...this will display french 
        //(or whatever is passed in)
        Form2 form = new Form2();
        form.Initialize(Languages.French);
        form.ShowDialog();
    }

    Languages editValue;
    bool isEdit = false;

    public Form2()
    {
        InitializeComponent();
    }

    public void Initialize(Languages var)
    {
        editValue = var;
        isEdit = true;
    }

    private void Form2_Load(object sender, EventArgs e)
    {
        comboBox1.DataSource = Enum.GetValues(typeof(Languages));

        if (isEdit)
        {
            comboBox1.SelectedItem = editValue;
        }
    }

public enum Languages
{
    English = 0,
    French = 1,
    Spanish = 2,
    German = 3
}

設置數據源時,將傳遞對象數組。 設置SelectedItem時,將傳遞一個枚舉值,因此它將再次裝箱到對象。 ComboBox使用IndexOf方法在DataSource值中搜索您的項目,該方法使用Object.Equals方法將這些值與新值進行比較。 並且由於它們是不同的對象(引用不同),因此在DataSource集合中永遠找不到您的項目,因此選擇不會更改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM