我有一个字典,其字母为三字母国家代码,其值为国家名称。
Dictionary<string, string> CountryList=new Dictionary<string, string>();
我还有一个DataGridView和一个DataTable。我想要做的是为我的DataTable列中的某些列创建一个显示国家/地区信息的DataGridViewComboBoxColumn。因此,例如,我的DataTable中的一个列名为Country
,我希望该列有一个下拉组合框,显示该国家/地区的名称,并在选中后填充DataTable中的单元格与字典中的键(三个字母代码)。但是,我完全不知道如何做到这一点。我是否必须将DataSource设置为键,将DisplayMember设置为值?我试过了,但得到了一个错误:
DataGridViewComboBoxColumn buildCountries = new DataGridViewComboBoxColumn();
buildCountries.HeaderText = "List of Countries";
buildCountries.DataSource = CountryList.Keys.ToString();
buildCountries.DisplayMember = CountryList.Values.ToString();
复杂DataBinding接受IList或IListSource
作为数据源
我不知道该怎么做。
答案 0 :(得分:3)
我并非100%肯定,但我认为你无法按照自己的方式完成这项工作。我知道这可能被视为重炮,但您可以在DataTable
中创建Dictionary
并在其上执行DataBinding
。
DataGridViewComboBoxColumn buildCountries = new DataGridViewComboBoxColumn();
buildCountries.HeaderText = "List of Countries";
DataTable dataTable = new DataTable();
dataTable.Columns.Add("Keys");
dataTable.Columns.Add("Values");
KeyValuePair<string, string> [] array = CountryList.ToArray();
foreach(KeyValuePair<string, string> kvp in array)
{
dataTable.Rows.Add(kvp.Key, kvp.Value);
}
buildCountries.DataSource = dataTable;
buildCountries.DisplayMember = "Values";
buildCountries.ValueMember = "Keys";
dataGridView1.Columns.Add(buildCountries);
答案 1 :(得分:1)
使用Keys.ToString()
,您将创建一个表示Keys集合的String,而不是获取键列表。这将返回:
System.Collections.Generic.Dictionary'2 + KeyCollection [System.String,System.String]
DisplayMember是DataSource中每个项目的属性名称,它应该显示在ComboBox中 - 这应该是"Value"
。
试试这个:
Dictionary<string, string> CountryList=new Dictionary<string, string>();
DataGridViewComboBoxColumn buildCountries = new DataGridViewComboBoxColumn();
buildCountries.HeaderText = "List of Countries";
buildCountries.DataSource = CountryList.ToArray();
buildCountries.ValueMember = "Key";
buildCountries.DisplayMember = "Value";
CountryList.ToArray()
会为您提供一系列KeyValuePair<string, string>
s,它会实现IList。
如果您想获取所选的国家/地区代码,请使用buildCountries.SelectedValue
。
答案 2 :(得分:0)
您可以使用以下内容将字典设置为DataGridViewComboBoxColumn的数据源
buildCountries .DisplayMember = "Key";
buildCountries .ValueMember = "Value";
buildCountries .DataSource = new BindingSource(CountryList, null);