[英]Binding Windows Form Combobox to Anonymous Type
我有一个Dictionary<string, List<string>>
,其中string是文件的路径。 我想在一个组合框中显示File的名称,然后使用该文件名作为在SelectedValueChanged
上捕获它的值。
var cmbDatasource = (from moduleReference in moduleReferences
select new { FilePath = moduleReference.Key, Filename = new FileInfo(moduleReference.Key).Name }).ToList();
cmbModules.DataSource = cmbDatasource;
cmbModules.DisplayMember = "Filename";
cmbModules.ValueMember = "FilePath";
然后,我在SelectedValueChanged
事件中执行此操作
private void cmbModules_SelectedValueChanged(object sender, EventArgs e)
{
var cmb = (ComboBox)sender;
if (cmb != null)
{
var test = cmb.SelectedValue.ToString();
}
}
test
现在成为对值成员(Path)的匿名类型。
我看过这里,但看不到自己在做什么。
例
Dictionary<string, List<string>> moduleReferences = new Dictionary<string, List<string>>();
moduleReferences.Add("C:\Test.txt", new List<string>());
组合框应显示Test.txt
但是当我捕获事件时,我希望得到C:\\Test.txt
在字典中进行查找。 我在这里做错什么吗?
我相信当你执行
var test = cmb.SelectedValue.ToString();
您只使用选定的值,而不是与模块Reference.Key相同类型的项目本身。 如果要获取整个记录,则需要执行
var test = cmb.SelectedItem;
也许我的回答会帮助某人找到解决方案。 使用关键字动态,您可以通过以下方式实现:
var cmbDatasource = (from moduleReference in moduleReferences
select (dynamic)new { FilePath = moduleReference.Key, Filename = new FileInfo(moduleReference.Key).Name }).ToList();
cmbModules.DataSource = cmbDatasource;
cmbModules.DisplayMember = "Filename";
cmbModules.ValueMember = "FilePath";
然后在选定的值更改事件处理程序中:
private void cmbModules_SelectedValueChanged(object sender, EventArgs e)
{
var cmb = sender as ComboBox;
if (cmb != null)
{
dynamic item = (dynamic)cmb.SelectedItem;
string fname = item.Filename;
string fpath = item.FilePath;
}
}
但是将SelectedItem设置为组合框变得更加困难:
public void SelectFile(String fname)
{
foreach (dynamic item in cmbModules.Items)
{
if (item.Filename == fname)
{
cmbModules.SelectedItem = item;
break;
}
}
}
PS,您需要添加对Microsoft.CSharp程序集的引用
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.