【问题标题】:ComboBox SelectedItem from DataTable Winforms C#?DataTable Winforms C#中的ComboBox SelectedItem?
【发布时间】:2014-03-14 10:49:29
【问题描述】:

我的 DAL 中有一个方法,它从 DataTable 填充 ComboBox。 ComboBox 显示正确,我有一个“保存”按钮,可以保存回我的数据库,工作很好......

 public string populateLookUp(ref System.Windows.Forms.ComboBox Combo, string Id)
    {
        SqlCommand _comm = new SqlCommand();
        _comm.Parameters.AddWithValue("@id", Id);
        _comm.CommandText = "SELECT [name] FROM dbo.fnGetName(@id) ORDER BY [name]; ";   
        _comm.Connection = _conn;
        _comm.CommandTimeout = _command_timeout;

        DataTable dt = new DataTable();
        try
        {
            SqlDataReader myReader = _comm.ExecuteReader();
            dt.Load(myReader);
        }
        catch
        {
            MessageBox.Show("Unable to populate Name LookUp");
        }

        Combo.DataSource = dt;            
        Combo.DisplayMember = "name";

        foreach (DataRow dr in dt.Rows)
        {
            if (dr["company_int_name"].ToString() == Contract.Company_trans_Selling_Entity.ToString())
            {
                Combo.SelectedItem = dr["company_int_name"].ToString();
            }
        }
        return "";
    }

但是很明显,当我重新编辑记录时,会再次调用此方法。好的,我现在已经编写了一个 ForEach 循环,它遍历我的 DataTable 并将行中的字符串与我传入的名称进行比较。如果两者匹配,我将设置

Combo.SeletedItem =  dr["company_int_name"].ToString();

但是 selectedItem 没有设置,大概我需要某种事件来通知属性更改?

谢谢

【问题讨论】:

  • 保存记录时,是否存储组合框中选择的值?
  • 是的,我有一个传递值的保存方法。该值被传递到 sql INSERT 语句中。
  • 尝试使用组合框的文本属性,如下所示:Combo.Text = Contract.Name.ToString(); 而不是使用SelectedItem 属性
  • 只是一个建议。您可以在方法开始时取消注册 selectedIndexChanged 事件处理程序(如果您有),然后在结束时重新注册。

标签: c# winforms combobox datatable


【解决方案1】:

您必须将Combo Box与ValueMember函数绑定,并且可以将具有匹配字符串值的组合框反映为选中

public string populateLookUp(ref System.Windows.Forms.ComboBox Combo, string Id)
{
    SqlCommand _comm = new SqlCommand();
    _comm.Parameters.AddWithValue("@id", Id);
    _comm.CommandText = "SELECT [name] FROM dbo.fnGetName(@id) ORDER BY [name]; ";   
    _comm.Connection = _conn;
    _comm.CommandTimeout = _command_timeout;

    DataTable dt = new DataTable();
    try
    {
        SqlDataReader myReader = _comm.ExecuteReader();
        dt.Load(myReader);
    }
    catch
    {
        MessageBox.Show("Unable to populate Name LookUp");
    }

    Combo.DataSource = dt;            
    Combo.DisplayMember = "name";
    Combo.ValueMember = "name";

    foreach (DataRow dr in dt.Rows)
    {
        if (dr["company_int_name"].ToString() == Contract.Company_trans_Selling_Entity.ToString())
        {
            Combo.SelectedValue = dr["company_int_name"].ToString();
        }
    }
    return "";
}

【讨论】:

    猜你喜欢
    • 2014-04-19
    • 2017-02-20
    • 2012-01-18
    • 2015-09-29
    • 2017-04-30
    • 1970-01-01
    • 2019-06-03
    • 2011-01-10
    • 2023-04-03
    相关资源
    最近更新 更多