如何设置组合框的默认值?

26

Windows Form 中,有一个 ComboBox,它的数据绑定由DataSource提供。

当设置ComboBox的文本属性时,

选中 ComboBox -> 属性 -> 文本 : "--选择--"。

设计页面会显示给定的文本。但是运行应用程序后,给定的文本就消失了,而是出现了ComboBox项目的初始索引值,这个初始索引值来自于DataSource。

因此,在窗体加载时,我在构造函数中给ComboBox设置了文本。

public myform()
{
     InitializeComponent();
     ComboBox.Text="--Select--";
}

链接已经修订并有更多内容,但是...

如何在ComboBox中设置默认项

https://msdn.microsoft.com/zh-cn/library/system.windows.forms.combobox.text(v=vs.110).aspx

在Stack Overflow上搜索了很多与ComboBox相关的问题。但是这些都没有解决我的情况。

编辑过

输入图像描述

在那个ComboBox中,点击右上角,我使用数据源选择了数据来填充我的ComboBox。我没有编写任何添加项目到ComboBox的代码。


3
你是通过 ComboBox.Items.Insert(0, "--Select--"); 在下拉框中插入项目,并使用 ComboBox.SelectedIndex = 0; 设置选定索引吗? - Vandita
感谢您的回复@Vandita。我使用了数据源来限定数据,因此无法添加新值。 - User6667769
你可以在数据绑定的代码后面添加。 - Vandita
2
如果您设置了DataSource属性,则无法从代码更改Text属性。在数据源中添加“--Select--”文本作为虚假项(这取决于您使用的数据源类型)。 - Steve
1
我怀疑绑定是在你的代码之后执行的,这使得文本消失了。你不能添加一个新项到已经绑定的列表中吗? - user1845593
显示剩余4条评论
2个回答

36

你可以像这样做:

    public myform()
    {
         InitializeComponent(); // this will be called in ComboBox ComboBox = new System.Windows.Forms.ComboBox();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        // TODO: This line of code loads data into the 'myDataSet.someTable' table. You can move, or remove it, as needed.
        this.myTableAdapter.Fill(this.myDataSet.someTable);
        comboBox1.SelectedItem = null;
        comboBox1.SelectedText = "--select--";           
    }

为什么?您可以进行检查,如果SelectedIndex != 0,然后在SelectedIndexChange事件上继续您的代码。 - Vandita
2
@Vandita 这段代码无法工作。一旦设置了数据源,就不能更改Items集合。否则会出现ArgumentException异常。 - Steve
@User6667769:你必须初始化一个数据源,该数据源将被添加到 private void Form1_Load(object sender, EventArgs e) 中。在该加载方法中添加 BindComboBox()。我已经测试过了,它可以正常工作! - Vandita
嘿,在那个下拉框中,点击右上角,在那里使用数据源选择了我的下拉框的数据。我没有编写将项目添加到下拉框中的任何代码。因此,它自动将数据的第一个索引值设置为索引0。那么我该如何将新数据添加到第0个索引中?这会导致异常。 - User6667769

9
假设您将下拉框绑定到一个 List<Person>
List<Person> pp = new List<Person>();
pp.Add(new Person() {id = 1, name="Steve"});
pp.Add(new Person() {id = 2, name="Mark"});
pp.Add(new Person() {id = 3, name="Charles"});

cbo1.DisplayMember = "name";
cbo1.ValueMember = "id";
cbo1.DataSource = pp;

目前您不能随意设置Text属性,而是需要在设置数据源前先向列表添加一个项目。

pp.Insert(0, new Person() {id=-1, name="--SELECT--"});
cbo1.DisplayMember = "name";
cbo1.ValueMember = "id";
cbo1.DataSource = pp;
cbo1.SelectedIndex = 0;

当然,这意味着在尝试使用组合框中的信息时,您需要添加一个检查代码。
if(cbo1.SelectedValue != null && Convert.ToInt32(cbo1.SelectedValue) == -1)
    MessageBox.Show("Please select a person name");
else
    ...... 

使用DataTable而不是List,代码相同。您需要在datatable的Rows集合的第一个位置添加一行假数据,并设置ComboBox的初始索引以使事情更清晰。您只需要查看datatable列的名称以及在将行添加到集合之前哪些列应包含非空值即可。
在具有三个列(ID,FirstName,LastName)的表格中,其中ID,FirstName和LastName是必需的,您需要:
DataRow row = datatable.NewRow();
row["ID"] = -1;
row["FirstName"] = "--Select--";    
row["LastName"] = "FakeAddress";
dataTable.Rows.InsertAt(row, 0);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接