我填充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,但我知道我做错了。
答案 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);
完成此操作后,您只需通过
即可获得IDSQL.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
属性进行管理;它仅接受实现IList或IListSource的复杂对象。字典没有。
您当然可以将“词典”转换为列表,该列表现在将被接受:
[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)
或类似。此方法意味着迭代集合,直到找到正确的元素或找不到为止。