为combobbx项设置正确的索引

时间:2012-09-25 15:02:23

标签: c# winforms

有些对象具有OrderNanme,OrderCode等属性,以及当前我在HashSet中插入它们的许多其他属性(它们是唯一的,因此在我的场景中可以找到使用“set”)。

然后代码中的其他地方我很难通过这个HashSet并将这些对象的OrderName添加到一个combobx中,这样用户就可以在combobbx中看到这些名称。

现在我还有一个OrderCode,如果它匹配那些HashSet项目中的任何订单代码,那么我希望在该订单上设置Combobx的默认文本,当然我们仍然填充整个项目combobx ......我有没有办法一次性做到这一点?我想我需要另外一个foreach,并找到该项目的位置,并将其索引设置为combbox的选定索引但是有更短的方法吗?

double defaultOrder = GiveMeDefaulyOrder() ; // ok so some order number we have here.

foreach(CustomerOrderClass item in cntrlr.ThatHashSet)
{
    comboBox.Item.Add( item.OrderName)
}

//  Now do I need another foreach to just go and find that defaultOrder and set its defaultIndex...but is there a shorter way for this?

2 个答案:

答案 0 :(得分:1)

如果您不打算以某种方式对组合内容进行排序,则实际上可以在foreach迭代本身期间找到索引。例如:

int currentComboIndex = 0;
foreach(CustomerOrderClass item in cntrlr.ThatHashSet)
{
    comboBox.Item.Add( item.OrderName)
    if(orderCode == item.OrderCode)
        currentComboIndex ++;
}

退出周期后,您将获得或0最后项的索引等于指定的orderCode(顺便说一下,可以0 ),所以你可以在循环后做:

comboBox.SelectedIndex = currentComboIndex;

答案 1 :(得分:1)

我使用组合框的DataSource绑定一个简单的HashSet作为例子 此代码需要使用一些Linq表达式,但不需要循环将Order项添加到组合框。

public partial class Form1 : Form
{
    HashSet<Order> list = new HashSet<Order>();

    public Form1()
    {
        InitializeComponent();
        LoadData();
        comboBox1.DisplayMember = "OrderName";
        comboBox1.ValueMember = "OrderNum";
        comboBox1.DataSource = list.ToArray<Order>();
    }

    private void LoadData()
    {
        // Load some sample data
        for(int x = 0; x < 10; x++)
        {
            Order o = new Order(){OrderName = "Name" + x, OrderNum = x};
            list.Add(o);
        }
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        // Select the item with order number = 4 
        var x = list.Where<Order>(o => o.OrderNum == 4).FirstOrDefault<Order>();
        comboBox1.SelectedItem = x;

    }
}

public class Order
{
    public string OrderName;
    public int OrderNum;
    public override string ToString()
    {
        return this.OrderName;
    }
}