如何使用c#for Winforms API将新项目按钮添加到下拉列表

时间:2015-01-09 03:32:14

标签: c# winforms drop-down-menu

我有一个下拉列表,我使用从数据库中提取的数据集以编程方式填充它。

我喜欢做的是添加一个选项,就像一个按钮“”按钮。单击它时,用户将导航到其他表单。

像这样的事情  (点击下拉菜单前的屏幕截图) enter image description here

(截图显示选项,如按钮“”

enter image description here

这是我用来填充菜单的代码

private void InventoryAdd_Load(object sender, EventArgs e)
{
    InputDepartment.Items.Clear();
    InputVendors.Items.Clear();

    //populate the Departments menu
    dbConnetion db = new dbConnetion();

    string sql =  " SELECT departmentName, departmentID "
                + " FROM departments "
                + " WHERE status = 'active' ";

    InputDepartment.Items.Clear();
    var deptSource = new List<ComboItem>();

    deptSource.Add(new ComboItem { ID = -1, Text = "Select a Department" });
    deptSource.Add(new ComboItem { ID = 0, Text = " < Add New> " });

    foreach (var item in db.getData(sql, null, r => new ComboItem()
                                    {

                                        ID = Convert.ToInt32(r["departmentID"]),
                                        Text = r["departmentName"].ToString()
                                    })
    )
    {
        deptSource.Add(item);

    };

    InputDepartment.DataSource = deptSource;

}



//This generic class will help setting an id and a text for a comboItem
class ComboItem
{
    public int ID { get; set; }
    public string Text { get; set; }
    public string Val1 { get; set; }

    public override string ToString()
    {
        return Text;
    }
}

这是我的getData方法         //查询数据库

public IEnumerable<T> getData<T>(string query, List<MySqlParameter> pars, Func<IDataRecord, T> transform)
{
    using (var conn = new MySqlConnection(conn_string))
    using (var cmd = new MySqlCommand(query, conn))
    {
        if (pars != null)
        {
            foreach (MySqlParameter p in pars)
            {
                cmd.Parameters.Add(p);
            }
        }

        conn.Open();

        using (var rdr = cmd.ExecuteReader())
        {

            while (rdr.Read())
            {
                yield return transform(rdr);
            }
        }

        conn.Close();
    }
}

1 个答案:

答案 0 :(得分:1)

而不是

deptSource.Add(new ComboItem { ID = i.ID, Text = i.Text });

使用

deptSource.Add(i);

因为我已经是一个ComboItem。此外,如果你的getData返回IEnumerable,那可能会很昂贵,所以请使用。

foreach (var i in db.getData(sql, null, r => new ComboItem()
    {
         ID = Convert.ToInt32(r["departmentID"]),
         Text = r["departmentName"].ToString()
     }).ToList()

甚至更简单:

deptSource.AddRange( db.getData(sql, null, r => new ComboItem()
    {
         ID = Convert.ToInt32(r["departmentID"]),
         Text = r["departmentName"].ToString()
     }) );

最后,您需要将事件挂钩到:

protected override void OnSelectedValueChanged( EventArgs e )

然后您可以检查新值是否为0并在其他位置执行新项目添加。

<强>更新

我不相信标准的ComboBox支持添加按钮。有第三方工具,这样做。 WPF也有。