我很难在winforms组合框中选择合适的项目。之前我详细描述了here,但我认为问题仍然没有解决,因为我使用一个表单来添加/编辑记录。所以在表格加载方面我有
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
设置为德语SelectedItem
,在调试模式下也始终为空。
P.S。我尝试使用comboBoxLang.SelectedItem = (book.EnumLang)book.Language;
和SelectedValue但仍保持不变。
再一次,我猜这个问题是在页面加载时填充组合框,但我不知道是不是以及如何解决这个问题。
请询问更多信息。
答案 0 :(得分:2)
在加载事件的底部,填充控件后执行
if (isEdit)
{
//Set your controls selected values from the object you are editing
}
现在,对于新对象,只需制作表单并在其上调用Show或ShowDialog。这将导致Load事件触发,您的控件将填充。
对于编辑,请制作表单,调用Initialize,然后执行Show / ShowDialog。由于您的Initialize方法设置了isEdit = true,因此将加载load事件底部的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
}
答案 1 :(得分:1)
设置DataSource时,会传递一个对象数组。 当您设置SelectedItem时,您传递一个枚举值,因此它再次被装箱到一个对象。 ComboBox使用方法IndexOf在DataSource值中搜索您的项目,该方法使用Object.Equals方法将这些值与新值进行比较。由于它们是不同的对象(引用不同),因此您的项目永远不会在DataSource集合中找到,因此选择不会更改。