0

我有一个Dictionary<string, List<string>>where 字符串是文件的路径。我想在组合框中显示文件的名称,然后使用文件名作为值来捕获它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现在成为匿名类型作为值成员(路径)的姿势。

使用带有 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在字典中查找的事件时,应该显示组合框。我在这里做错什么了吗?

4

2 回答 2

1

我相信当你执行

var test = cmb.SelectedValue.ToString(); 

您只获取选择的值,而不是与 moduleReference.Key 类型相同的项目本身。如果你想得到你需要做的整个记录

var test = cmb.SelectedItem;
于 2012-10-17T13:40:02.870 回答
0

也许我的回答会帮助某人找到解决方案。使用关键字动态,您可以这样做:

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 程序集的引用

于 2017-03-23T13:29:50.480 回答