【问题标题】:Default combobox first item mixed with database results默认组合框第一项与数据库结果混合
【发布时间】:2016-11-12 23:34:20
【问题描述】:
public static void fill_combo(string table, ComboBox cmb, string columns)
    {
        ds = new DataSet();
        try
        {
            conn.Open();

            da = new SqlDataAdapter($"SELECT {columns} FROM [{table}]", conn);

            da.Fill(ds, table);
            cmb.DataSource = ds.Tables[table];
            cmb.ValueMember = ds.Tables[table].Columns[0].ToString();
            cmb.DisplayMember = ds.Tables[table].Columns[1].ToString();

            cmb.SelectedItem = null;
            cmb.Text = "Select...";

        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, "Error");

        }
        finally
        {
            if (conn != null)
            {
                conn.Close();
            }
        }
    }

大家好。 使用上面的代码,我试图从数据库中获取结果并将它们绑定到组合框,但我希望第一项是不在数据库中的随机“选择 ...”。提前致谢。

【问题讨论】:

  • 这样的东西有用吗? cmb.Items.Insert(0, "选择...");
  • @BenSteele 否,设置 DataSource 属性时无法修改 Items 集合。

标签: c# sql-server winforms combobox ado.net


【解决方案1】:

选项 1 - 您可以将包含所需值的 DataRow 插入到 DataTable:

var connection = @"Your Connection String";
var command = "SELECT Column1, Column2 FROM Table1";
var dt = new DataTable();
using (var da = new SqlDataAdapter(command, connection))
    da.Fill(dt);
var row = dt.NewRow();
row["Column1"] = DBNull.Value;
row["Column2"] = "Select an Item";
dt.Rows.InsertAt(row, 0);
this.comboBox1.DataSource = dt;
this.comboBox1.ValueMember = "Column1";
this.comboBox1.DisplayMember = "Column2";

选项 2 - 您可以将DropDownStyle 设置为DropDownList 并将其DrawMode 设置为OwnerDrawFixed 并处理DrawItem 事件,而不是向DataTable 添加空数据并在选定索引为-1时绘制占位符:

private void comboBox1_DrawItem(object sender, DrawItemEventArgs e)
{
    var combo = sender as ComboBox;
    var text = "Select an Item";
    if (e.Index > -1)
        text = combo.GetItemText(combo.Items[e.Index]);
    e.DrawBackground();
    TextRenderer.DrawText(e.Graphics, text, combo.Font,
        e.Bounds, e.ForeColor, TextFormatFlags.Left);
}

要显示占位符,设置comboBox1.SelectedIndex = -1;就足够了

【讨论】:

    【解决方案2】:

    我认为这是多虑了。设置源后,只需将组合框的 .Text 属性设置为“选择项目...”。确定占位符文本实际上并未添加到 Items 列表中,但它为用户实现了所需的结果,对吗?

    【讨论】:

      猜你喜欢
      • 2023-03-03
      • 2022-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多