向ComboBox添加数据(非绑定数据)

7

我希望向下拉框列表中添加数据,但不确定正确的方法。数据来自原始SQL语句。

我已经尝试直接从数据库绑定数据,但对于我来说,所有这些绑定和数据集是如何工作并不清楚,因此我决定跳过这一步,在您的帮助下将数据插入到下拉框中。

我在网上看到的代码如下:

public partial class Form1 : Form {
    // Content item for the combo box
    private class Item {
        public string Name;
        public int Value;
        public Item(string name, int value) {
            Name = name; Value = value;
        }
        public override string ToString() {
            // Generates the text shown in the combo box
            return Name;
        }
    }
    public Form1() {
        InitializeComponent();
        // Put some stuff in the combo box
        comboBox1.Items.Add(new Item("Blue", 1));
        comboBox1.Items.Add(new Item("Red", 2));
        comboBox1.Items.Add(new Item("Nobugz", 666));
    }

    private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) {
        // Display the Value property
        Item itm = (Item)comboBox1.SelectedItem;
        Console.WriteLine("{0}, {1}", itm.Name, itm.Value);
    }
}

您是否真的需要创建一个新类,只是为了向组合框添加数据? 此外,使用上述技术,我的代码如下:

    while (rdata.Read()){
        String Name = (String)rdata["vetName"];
        Name = Name.Trim();
        String Surname = (String)rdata["vetSurname"];
        Surname = Surname.Trim();

        String id = rdata["vetID"].ToString().Trim();

        MessageBox.Show("ID " + id);

        int value1 = Convert.ToInt32(id);
        MessageBox.Show("value1 " + value1);

        String display = (String)Name + " " + Surname;

        editVetComboBox.Items.Add(new Item(display, 2));
    }

问题在于,虽然下拉框中填充了名字和姓氏,但值(ID)未被添加。 有什么想法吗?
非常感谢, Richard

1
从你的代码看,似乎这个值总是2。这是打错字了吗? - Alex Aza
顺便提一下,回答这样的问题通常需要了解代码在运行时的行为(例如如果我要调试它)。您有几个消息框和Console.WriteLine,可以提供这样的信息,但您没有将其提供给我们。如果代码中有注释,如“//此处我有正确的值6”和“//由于某种原因,这里的值是1243”,那么回答这样的问题会更容易。 - Snowbear
嗨,Alex,是的,我只是为了测试在那里放了值2,但该值没有被添加。 - DevilCode
4个回答

12

来源:http://tipsntricksbd.blogspot.com/2007/12/combobox-is-one-of-most-common-gui.html

ComboBox 是最常见的 GUI 元素之一。它用于提供用户从列表中选择项目或输入新文本的功能。在这里,我将使用 Microsoft Visual Studio .Net 2005 展示 C# 中 ComboBox 的几个常见和有用的功能。

最简单的 ComboBox:

在最简单的情况下,我们可以像以下示例中那样向列表中添加一些字符串:

myComboBox.Items.Add("Bangladesh");
myComboBox.Items.Add("India");
myComboBox.Items.Add("Pakistan");
myComboBox.Items.Add("Srilanka");
myComboBox.Items.Add("Maldives");
myComboBox.Items.Add("Nepal");
myComboBox.Items.Add("Bhutan");

已排序列表:

通常用户希望选项以排序顺序显示。为此,我们需要添加一行代码-

myComboBox.Sorted = true;

DropDownStyle:

在ComboBox控件中,用户可以输入文本或从列表中选择一个项目。因此,开发人员应设置其样式。有三个选项可用:

ComboBoxStyle.DropDownList: User can just select one item from a list.
ComboBoxStyle.DropDown: User can either type a text or select an item from list.
ComboBoxStyle.Simple: User can only type a text in text box. Item list is not shown.

例子:

myComboBox.DropDownStyle = ComboBoxStyle.DropDown;

建议/词典:

当用户输入文本时,如果在输入期间下拉框下方显示了一些建议,用户会感到高兴。为实现此功能,我们需要编写几行代码-

myComboBox.AutoCompleteSource = AutoCompleteSource.ListItems;
myComboBox.AutoCompleteMode = AutoCompleteMode.Suggest;

一个技巧:

有时用户选择了一些可读的文本,但对于程序员来说,相应的值(而不是所选的文本)更为重要。例如,在数据库项目中,对于程序员而言,学生ID比学生姓名更为重要。因此,如果我们可以在下拉框中添加(名称,值)组合,则在选择名称时,我们可以轻松地获取相应的值。

我们可以通过添加一个包含名称和值的对象来实现这一点。

class ComboBoxItem
{
public string Name;
public int Value;
public ComboBoxItem(string Name, int Value)
{
this.Name = Name;
this.Value = Value;
}
}


myComboBox.Items.Add(new ComboBoxItem("Ashis Saha",1));
myComboBox.Items.Add(new ComboBoxItem("Subrata Roy", 2));
myComboBox.Items.Add(new ComboBoxItem("Aminul Islam", 3));
myComboBox.Items.Add(new ComboBoxItem("Shakibul Alam", 4));
myComboBox.Items.Add(new ComboBoxItem("Tanvir Ahmed", 5));

但是,如果您现在查看ComboBox的列表,您会注意到所有项目都是相同的,并且它们是这些对象的类名称。 实际上,这些项目仅仅是这些对象的ToString()函数的输出。 因此,如果我们简单地重写ToString()函数以符合我们的期望,那么问题就解决了。

class ComboBoxItem
{
public string Name;
public int Value;
public ComboBoxItem(string Name, int Value)
{
this.Name = Name;
this.Value = Value;
}

// override ToString() function
public override string ToString()
{
return this.Name;
}
}

你可以按照以下方式获取所选的值:

int selectedValue = ((ComboBoxItem)myComboBox.SelectedItem).Value;

如果用户在没有从列表中选择相应项目的情况下写入“Shakibul Alam”,你如何找到ID=4?您使用字典(值,ID)还是使用for循环? (这是因为myComboBox.IndexOf(myComboBox.Text)显然总是返回-1)谢谢 - Fil

1

我看到你的代码中数值始终为2。这可能是你遇到的问题。

另外,我尝试简化了一下你的代码:

while (rdata.Read())
{
    string name = (string)rdata["vetName"];
    string surname = (string)rdata["vetSurname"];
    int id = (int)rdata["vetID"];
    string display = name.Trim() + " " + surname.Trim();
    editVetComboBox.Items.Add(new Item(display, id));
}

假设vetID是整数,并且所有列出的字段在数据库中都不可为空。

我认为 string Name = rdata["vetName"].ToString().Trim(); 更易读。但只是说一下,这是一个加1... - Ortiga
如果rdata["vetName"]不是可空字段,则其内部已经有字符串对象。如果它是可空的,那么你需要使用rdata["vetName"] as string - Alex Aza
我可以成功获取数据,它不是空的。只是将项目添加到组合框的过程似乎很困难... - DevilCode
@DevilCode - 我试了一下你的代码,它可以向组合框中添加项目。对我来说很有效,我可以在comboBox1_SelectedIndexChanged事件中看到值。可能还有其他你没有在代码中展示的东西。 - Alex Aza

0
不,你不需要创建新的类才能向ComboBox添加数据,如果你想要,你只需要添加字符串。类是为了方便而存在的,在这里它们确实很方便-为什么你要避免使用它们?(也许我没有完全理解你的问题...)
如果你只是要执行字符串操作并且一直在对该类使用ToString(),而不是访问单个属性,则没有必要使用它-只需将它格式化为字符串并使用即可。

请澄清,我无法将值添加到此情况下的组合框中,该组合框为ID。字符串名+姓氏显示正常。有什么非类方式可以做到这一点吗? - DevilCode

0
不,您不必创建自己的类......但与您正在做的事情相符是有道理的。在您的应用程序中,建议使用类类型表示数据库实体。重写实体类的ToString()方法。接下来,将这些类类型直接插入ComboBox中。ComboBox将调用您实体的ToString()方法来显示文本。
以下是它的样子:
public class Vet
{
    public int ID { get; set; }
    public string Name { get; set; }
    public string SurName { get; set; }

    public Vet()
    {
        // default constructor
    }

    public Vet( IDataRecord record )
    {
        ID = (int) record["vetid"];
        Name = (string) record["vetname"];
        SurName = (string) record["vetsurname"];
    }

    public override string ToString()
    {
        return Name + " " + SurName;
    }
}

接下来,直接将实例添加到您的组合框中:

comboBox.Items.Clear();
while( rdata.Read() )
{
   comboBox.Items.Add( new Vet( rdata ) );
}

这里的ID将是一个整数。但是它如何分配给组合框,函数只返回一个字符串(名字+姓氏)。 - DevilCode
在这种情况下,ToString()的重写有什么作用?它在强制转换var = (string) record["vetsurname"]期间被调用吗?好的,也许更好的问题是:我想将字符串“Hello World”和关联值“200”添加到组合框中显示。最简单的方法是什么:combobox.Items.Add("Hello World", 200); <----是否有类似这样的方法? - DevilCode
当您将一个对象添加到组合框中时,组合框将调用每个项目的ToString()方法以获取显示文本。在类类型中,您可以让ToString()方法返回任何您想要的内容。在这里,我让它返回“名字+姓氏”。如果您想让它返回其他内容,只需在ToString()方法的返回语句中指定即可。 - Jordan Parmer
是的,ToString()重写提供了ComboBox的Display Member,那么如何以这种方式还提供Value Member,即分配给该显示成员的值呢? - DevilCode

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