如何通过键从组合框中选择一个项目?

时间:2019-07-02 15:10:31

标签: c# winforms combobox key

我填充comboBox,从数据库中获取数据

这是我的数据库结构:

$Global:Server = "server"      
$Global:Database = "db"
$Global:u = "un"
$Global:p = "pw"
[string]$Query = "SELECT * FROM [dbo].[jobs] WHERE [Run] = 0"
try{
$ConnectionString = "server=$Server;Integrated Security=true;database=$Database;user id=$u;password=$p"
$Connection = New-Object System.Data.SqlClient.SqlConnection
$Connection.ConnectionString = $ConnectionString
$Connection.Open()
}
catch{
    "Failed to connect SQL Server"     
}

$Command = $Connection.CreateCommand()
$InnerCommand = $Connection.CreateCommand()
$Command.CommandText = $Query
$jobs = $Command.ExecuteReader()

    while ($jobs.Read()){

        switch($jobs["Script"]){                
            15
            {
                $traverse = $jobs["Frequency"] - 1
                While ($traverse -ge 0) {
                    c:\xx\xx\batch $jobs["Date"]
                    $traverse--
                }

                "Updating Database...."
                $Query2 = "UPDATE [dbo].jobs SET [Run] = 1 WHERE [ID] = $jobs['ID']" <------Error here.
                $InnerCommand.CommandText = $Query2
                $InnerCommand.ExecuteNonQuery()
                "Updating Completed!"
            }
        }
    }
$Connection.Close()
$Connection.Dispose()
Write-Host "Connection Closed"

这是我的班级结构

Table names

ID ------ Name

1  ------ John
2  ------ Sarah
3  ------ Peter

这就是我声明字典和设置字典的方式

// Class structure

    public class Names
    {
        public int id;
        public string name;
    }
// Declare dictionary
Dictionary<int, string> dataSouceNames;

public MyProgram()
{
    InitializeComponent();
    dataSouceNames = getComboDataSourceNames();
}

这是我用于从数据库获取数据的SQL

//Dictionary
private Dictionary<int, string> getComboDataSourceNames()
{
    Dictionary<int,string> comboSource = new Dictionary<int,string>();

    List<Names> res = dataProvider.getAllNames();

    foreach (Names item in res)
    {
        comboSource.Add(item.id, item.nome);
    }

    return comboSource;
}

最后我如何填充组合框

getAllNames()
{
    string sql = "SELECT * FROM names";
}

然后我尝试通过键在组合框中选择项目:

// Function fill combobox
private void initComboNames()
{
    cmbNames.DataSource = new BindingSource(dataSourceNames, null);
    cmbNames.DisplayMember = "Text";
    cmbNames.ValueMember = "Value";
}

我期望输出“ Sarah”为SelectedIndex,但我知道我做错了。

3 个答案:

答案 0 :(得分:0)

我认为您必须传递名称(“ Sarah”而不是ID“ 2”),如果不能的话,请使用SelectedValue。

cmbNames.SelectedValue = Names.Id;

否则,如果您知道索引,可以这样做

cmbNames.SelectedIndex= 1;

答案 1 :(得分:0)

首先,您以这种方式填充组合框。这样,comboBox将向用户显示名称(显示成员),但是当您选择索引时,它将为您提供ID(值成员)

...
result = "data:image/jpg;base64,"+ new String(encoded);

完成此操作后,您只需通过

即可获得ID
SQL.con.Open();
DataTable tb = new DataTable();
SqlCommand cmd = new SqlCommand("select columnID,Name from TableName",SQL.con);
SqlDataReader dr;
dr = cmb.ExecuteReader();
tb.Load(dr);
comboBox.DisplayMember = "Name";
comboBox.ValueMember = "columnID";
comboBox.DataSource = tb; 

请记住您想要的字段的变化,例如comboboc,columnId等

答案 2 :(得分:0)

为什么我建议使用这种分配方式来设置ComboBox的当前项目:

cmbNames.SelectedItem = new KeyValuePair<int, string>(Names.ID, dataSouceCantieri[Names.ID]);

,并定义 DisplayMember ValueMember 属性,如下所示:

cmbNames.DisplayMember = "Value";
cmbNames.ValueMember = "Key";
cmbNames.DataSource = new BindingSource(dataSouceCantieri, null);

这与设置 [ComboBox].DataSource = [Dictionary<TKey, TValue>]; 时发生的情况有关。
好吧,实际上您不能这样做。字典是一个复杂的对象,不能直接通过控件的DataSource属性进行管理;它仅接受实现IListIListSource的复杂对象。字典没有。

您当然可以将“词典”转换为列表,该列表现在将被接受:

[ComboBox].DataSource = [Dictionary<TKey, TValue>].ToList();

我们提供的是 List<KeyValuePair<TKey, TValue>> ,它实现了 IList<T>
另外,列表的每个元素都是KeyValuePair<TKey, TValue>
该对象公开两个属性: Key Value ,这允许访问对象的内部值。
字典仅公开Keys集合和Values集合属性。其他 complex 对象。

当您将 BindingSource.DataSource 设置为Dictionary时,此类执行相同的操作:它将测试我们分配的对象是实现IList还是{{1} };如果没有,它将创建一个新的BindingList并使用IEnumerable.GetEnumerator()方法从集合中提取元素。
Dictionary.GetEnumerator() IListSource 的形式返回集合的每个元素,与调用KeyValuePair<TKey, TValue>相同。

在.Net参考源中查看此行为:

BindingSource main constructor
IList list = [BindingSource].GetListFromEnumerable()
private static IList CreateBindingList(Type type)

所以,当我们分配这个:

[Dictionary].ToList()

我们实际上将控件的数据源设置为 cmbNames.DataSource = new BindingSource(dataSourceNames, null);
作为共识,每个IList<KeyValuePair<TKey, TValue>>是一个ComboBox.Item
KeyValuePair<TKey, TValue>,在这里。
这就是为什么我们可以设置:

KeyValuePair<int, string>
这些是[ComboBox].DisplayMember = "Value"; [ComboBox].ValueMember = "Key"; 类公开的属性的名称。

由于组合框的每个项目都是KeyValuePair<TKey, TValue>,因此要选择一个项目并使其成为当前项目,我们可以将其设置为特定的KeyValuePair<int, string>
对于您而言,密钥是由 KeyValuePair<int, string> 属性提供的:

Names.ID

我使用以下形式: cmbNames.SelectedItem = new KeyValuePair<int, string>(Names.ID, dataSouceCantieri[Names.ID]); ,因为这样我们可以直接通过Key访问字典 new KeyValuePair<int, string>(Names.ID, dataSouceCantieri[Names.ID]) ,所以这是一个dataSouceCantieri操作。

胜于写作:

O(1)

或类似。此方法意味着迭代集合,直到找到正确的元素或找不到为止。