English 中文(简体)
将数据添加到组合框(未绑定数据)
原标题:Adding Data to a ComboBox (Not bound data)

我希望将数据添加到comboboxlist中,但不确定执行此操作的正确方法。数据来自原始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);
    }
}

Do you really have to create a new class to just to add data to a combobox ? Also, using the above technique my code looks like:

    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));
    }

问题是,虽然组合框中填充了名字和姓氏<strong>,但没有添加值(ID)

有什么想法吗?

Many Thanks, Richard

最佳回答

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

ComboBox是最常见的GUI元素之一。它用于为用户提供从列表中选择项目或输入新文本的便利。在这里,我将使用MicrosoftVisualStudio.Net 2005向您展示C#中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:

在组合框中,用户可以输入文本,也可以只从列表中选择一个项目。所以开发者应该设置自己的风格。有3个选项可用:

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;

窍门:

可能存在用户选择一些可读文本的情况,但对于程序员来说,相应的值(而不是所选择的文本)是重要的。例如,在数据库项目中,StudentID对程序员来说比StudentName更重要。因此,如果我们可以在组合框中添加(Name,Value)组合,并且在选择Name时,我们可以很容易地获得相应的值,那就太好了。

我们可以通过添加一个包含Name和Value的对象来实现。

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;
问题回答

我可以看到,在您的代码中,值总是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是integer,并且数据库中列出的所有字段都不可为null。

不,您不必创建一个新的类来将数据添加到组合框中,您可以根据需要添加字符串。上课是为了方便,在这里它们看起来当然很方便——你为什么要避开它们?(也许我不太理解你的问题…)

如果你要做的只是执行字符串操作,并一直在类上使用ToString(),而不是访问单个属性,那么拥有它是没有意义的——只需将它格式化为字符串并使用它。

不,你不必创建自己的类。。。但这确实对你正在做的事情有意义。在应用程序中,最好使用类类型来表示数据库实体。重写实体类的ToString()方法。接下来,将这些类类型直接插入到组合框中。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 ) );
}




相关问题
Anyone feel like passing it forward?

I m the only developer in my company, and am getting along well as an autodidact, but I know I m missing out on the education one gets from working with and having code reviewed by more senior devs. ...

NSArray s, Primitive types and Boxing Oh My!

I m pretty new to the Objective-C world and I have a long history with .net/C# so naturally I m inclined to use my C# wits. Now here s the question: I feel really inclined to create some type of ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

How to Use Ghostscript DLL to convert PDF to PDF/A

How to user GhostScript DLL to convert PDF to PDF/A. I know I kind of have to call the exported function of gsdll32.dll whose name is gsapi_init_with_args, but how do i pass the right arguments? BTW, ...

Linqy no matchy

Maybe it s something I m doing wrong. I m just learning Linq because I m bored. And so far so good. I made a little program and it basically just outputs all matches (foreach) into a label control. ...

热门标签