我正在檔案夾中搜索 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);
}
uj5u.com熱心網友回復:
對于要執行的程式,您需要整個路徑。對于顯示來說,給用戶一個方向名稱就足夠了。現在唯一剩下的就是將一個映射到另一個。為此,您可以使用簡單的字典。將所有名稱收集為鍵,并將相應的路徑收集為值。僅顯示名稱。
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);
}
免責宣告:當然還有其他方法可以處理這個問題。可能最優雅的方法是創建一個類,該類將同時保存資訊部分并將這些物件的串列作為 DataSource 系結到 ComboBox。但這需要更多的研究和經驗。可能是其他人會建議這個解決方案
編輯:
正如 Panagiotis 系結示例所建議的:
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=map;
}
現在所選專案將自動成為字典專案的值,因此是完整路徑。你可以直接使用
private void button1_Click(object sender, EventArgs e)
{
System.Diagnostics.Process.Start(omboBox1.SelectedItem.ToString());
}
uj5u.com熱心網友回復:
您不需要將字串放入ComboBox- 您可以放入其他物件,并且ComboBox將用于.ToString()獲取要顯示的字串。
這意味著您可以撰寫一個這樣的包裝類來包含您需要的資訊:
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);
uj5u.com熱心網友回復:
使用資料系結而不是逐個添加專案,并使用屬性指定要顯示的DisplayMember屬性。如何:將 Windows 表單 ComboBox 或 ListBox 控制元件系結到資料顯示資料系結的作業原理。
一種選擇是將所有檔案的串列加載為 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);
}
您也可以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);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/509974.html
上一篇:我的要求是,如果values.yaml中的配置映射包含值DOMAIN_NAME那么我想用{.Values.global.domainName}替換它
