繁体   English   中英

将Windows窗体组合框绑定到匿名类型

[英]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)的匿名类型。

使用带有Linq匿名类型的ComboBox的SelectedItem属性

我看过这里,但看不到自己在做什么。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM