0

我很难在 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;

但即使将 passbook.Language设置为 GermanSelectedItem在调试模式下也始终为空。

ps 我也尝试使用 comboBoxLang.SelectedItem = (book.EnumLang)book.Language;SelectedValue 但保持不变。

我再一次猜想这个问题是在页面加载时填充组合框,但我不知道是不是以及如何解决这个问题。

请询问更多信息。

4

2 回答 2

2
  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
}
于 2013-10-18T18:07:57.990 回答
1

当你设置 DataSource 时,你传递一个对象数组。当您设置 SelectedItem 时,您传递一个枚举值,因此它再次被装箱到一个对象。ComboBox 使用 IndexOf 方法在 DataSource 值中搜索您的项目,该方法使用 Object.Equals 方法将这些值与您的新值进行比较。由于它们是不同的对象(引用不同),因此您的项目永远不会在 DataSource 集合中找到,因此选择不会更改。

于 2013-10-18T17:50:33.483 回答