winforms 如何打开组合框中项目的路径,同时只显示文件名?

xesrikrc  于 2022-11-17  发布在  其他
关注(0)|答案(3)|浏览(117)

我正在文件夹中搜索exe文件,并在组合框中显示文件名以供用户选择。当用户按下按钮时,所选文件应被打开。如果我在组合框中显示文件路径而不是文件名,则此操作有效。

public void Form1_Load(object sender, EventArgs e)
{

    string[] filePaths = Directory.GetFiles(@"C:\myFolder\", "*.exe");
    foreach (string file in filePaths)
    {
        comboBox1.Items.Add(Path.GetFileNameWithoutExtension(file));
    }
}

private void button1_Click(object sender, EventArgs e)
{
    object b = comboBox1.SelectedItem;
    string be = Convert.ToString(b);
    System.Diagnostics.Process.Start(be);
}
u91tlkcl

u91tlkcl1#

对于要执行的程序,你需要完整的路径。对于显示,给予用户一个方向的名称就足够了。现在剩下的唯一事情就是将一个Map到另一个。为此,你可以使用一个简单的字典。收集所有的名称作为键,对应的路径作为值。只显示名称。

private Dictionary<string, string> map = new Dictionary<string, string>();

public void Form1_Load(object sender, EventArgs e)
{

    string[] filePaths = Directory.GetFiles(@"C:\myFolder\", "*.exe");
    foreach (string fullPath in filePaths)
    {
        string displayName = Path.GetFileNameWithoutExtension(fullPath);
        map.Add(displayName, fullPath);
        comboBox1.Items.Add(displayName);
    }
}

然后使用名称作为键从字典中检索路径

private void button1_Click(object sender, EventArgs e)
{
    string nameKey = comboBox1.SelectedItem.ToString();
    string executablePath = map[nameKey];
    System.Diagnostics.Process.Start(executablePath);
}

编辑:
如Panagiotis Binding示例所示:
要使用绑定,您需要在组合框中指定要显示的内容和要作为值处理的内容。您可以通过告诉DisplayMemberValueMember应该使用字典的哪个属性来完成。此外,字典必须包含在BindingSource中。

public void Form1_Load(object sender, EventArgs e)
{

    string[] filePaths = Directory.GetFiles(@"C:\myFolder\", "*.exe");
    foreach (string fullPath in filePaths)
    {
        string displayName = Path.GetFileNameWithoutExtension(fullPath);
        map.Add(displayName, fullPath);
    }

    comboBox1.DisplayMember="Key";
    comboBox1.ValueMember="Value";
    comboBox1.DataSource= new BindingSource(map, null);
}

在本例中,您需要使用SelectedValue属性来检索字典项的值,即完整路径。

private void button1_Click(object sender, EventArgs e)
{        
    System.Diagnostics.Process.Start(comboBox1.SelectedValue.ToString());
}
cetgtptt

cetgtptt2#

你不需要把字符串放入ComboBox--你可以把其他对象放入,ComboBox将使用.ToString()来获取要显示的字符串。
这意味着您可以像这样编写一个 Package 类来包含您需要的信息:

public sealed class FileInformation
{
    public FileInformation(string fullFilename)
    {
        FullFilename = fullFilename;
        Filename = Path.GetFileNameWithoutExtension(fullFilename);
    }

    public override string ToString()
    {
        return Filename;
    }

    public string FullFilename { get; }
    public string Filename { get; }
}

那么填充ComboBox的代码将类似于:

string[] filePaths = Directory.GetFiles(@"C:\bin\", "*.exe");
foreach (string file in filePaths)
{
    comboBox1.Items.Add(new FileInformation(file));
}

按钮处理程序如下所示:

var info = (FileInformation) comboBox1.SelectedItem;
System.Diagnostics.Process.Start(info.FullFilename);
ie3xauqp

ie3xauqp3#

请使用数据系结,而不要逐一加入项目,并使用DisplayMember属性指定要显示的属性。How to: Bind a Windows Forms ComboBox or ListBox Control to Data显示数据系结的运作方式。
一个选项是将所有文件的列表作为FileInfo对象加载,并将它们设置为组合的DataSource属性,然后使用Name作为DisplayMember:

FileInfo[] _files=Array.Empty<FileInfo>();

public void Form1_Load(object sender, EventArgs e)
{
    comboBox1.DisplayMember="Name";
    var folder=new DirectoryInfo(@"C:\myFolder\");
    _files=folder.GetFiles("*.exe");
   comboBox1.DataSource=_files;
}

private void button1_Click(object sender, EventArgs e)
{
    var file = (FileInfo)comboBox1.SelectedItem;
    System.Diagnostics.Process.Start(file.FullName);
}

您也可以在combo的属性中设置DisplayMember
FileInfo没有返回不带扩展名的名称的属性,并且DisplayMember不接受表达式。如果需要显示名称,可以创建自己的类来保存文件和名称:

class MyFile
{
    public FileInfo File {get;set;}
    public string Name=>Path.GetFileNameWithoutExtension(File.FullName);
}

    MyFile[] _files=Array.Empty<MyFile>();

    public void Form1_Load(object sender, EventArgs e)
    {
        comboBox1.DisplayMember="Name";
        var folder=new DirectoryInfo(@"C:\myFolder\");
        _files=folder.EnumerateFiles("*.exe")
                     .Select(f=> new MyFile{File=file})
                     .ToArray();
       comboBox1.DataSource=_files;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        var file = (MyFile)comboBox1.SelectedItem;
        System.Diagnostics.Process.Start(file.File.FullName);
    }

相关问题