C# 如何在加载到列表框后获取DLL的路径
我正在创建一个将DLL加载到列表框中的应用程序。它是通过用户按下按钮来实现的,然后用户可以打开文件,并将其加载到listview中 所以看起来像这样 DLL是通过打开用户文件添加的,然后用户自己将其添加到列表框中 我的问题是。当有人在列表框中选择MaterialSkin.dll时,如何获取MaterialSkin.dll的确切路径并将其放入字符串中C# 如何在加载到列表框后获取DLL的路径,c#,winforms,dll,listbox,C#,Winforms,Dll,Listbox,我正在创建一个将DLL加载到列表框中的应用程序。它是通过用户按下按钮来实现的,然后用户可以打开文件,并将其加载到listview中 所以看起来像这样 DLL是通过打开用户文件添加的,然后用户自己将其添加到列表框中 我的问题是。当有人在列表框中选择MaterialSkin.dll时,如何获取MaterialSkin.dll的确切路径并将其放入字符串中 private void materialFlatButton3_Click_1(object sender, EventArgs e) //b
private void materialFlatButton3_Click_1(object sender, EventArgs e) //button used to load the DLL into the ListBox.
{
OpenFileDialog OpenFileDialog1 = new OpenFileDialog();
OpenFileDialog1.Multiselect = true;
OpenFileDialog1.Filter = "DLL Files|*.dll";
OpenFileDialog1.Title = "Select a Dll File";
if (OpenFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
// put the selected result in the global variable
fullFileName = new List<String>(OpenFileDialog1.FileNames);
// add just the names to the listbox
foreach (string fileName in fullFileName)
{
listBox2.Items.Add(fileName.Substring(fileName.LastIndexOf(@"\") + 1));
}
}
}
private void materialFlatButton3\u单击\u 1(对象发送方,事件参数)//用于将DLL加载到列表框中的按钮。
{
OpenFileDialog OpenFileDialog1=新建OpenFileDialog();
OpenFileDialog1.Multiselect=true;
OpenFileDialog1.Filter=“DLL文件|*.DLL”;
OpenFileDialog1.Title=“选择一个Dll文件”;
if(OpenFileDialog1.ShowDialog()==System.Windows.Forms.DialogResult.OK)
{
//将所选结果放入全局变量中
fullFileName=新列表(OpenFileDialog1.FileNames);
//仅将名称添加到列表框中
foreach(fullFileName中的字符串文件名)
{
listBox2.Items.Add(fileName.Substring(fileName.LastIndexOf(@“\”)+1));
}
}
}
确切路径来自OpenFileDialog1。文件名
因此,在填充列表框时,使用与当前索引对应的键将完整路径存储在字典中。当他们在列表框中选择一项时,使用该项进行字典查找。如果可能,我会调整OpenFileDialog1以在获取文件名时获取路径。然后,使用字典而不是列表,可以显示仅为.dll名称的显示成员,而值成员可以是dir或dir/.dll名称 以下是您发布的代码片段中的内容:
private void materialFlatButton3_Click_1(object sender, EventArgs e)
//button used to load the DLL into the ListBox.
{
OpenFileDialog OpenFileDialog1 = new OpenFileDialog();
OpenFileDialog1.Multiselect = true;
OpenFileDialog1.Filter = "DLL Files|*.dll";
OpenFileDialog1.Title = "Select a Dll File";
if (OpenFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
// put the selected result in the global variable
// ~~Using Dictionary instead of list~~
fullFileName = new Dictionary<string, string>(OpenFileDialog1.FileNames);
// Populate Listbox from dictionary.
listBox2.Datasource = fullFileName.ToList();
listBox2.DisplayMember = "Value";
listBox2.ValueMember = "Key";
}
}
private void materialFlatButton3\u单击1(对象发送者,事件参数e)
//用于将DLL加载到列表框中的按钮。
{
OpenFileDialog OpenFileDialog1=新建OpenFileDialog();
OpenFileDialog1.Multiselect=true;
OpenFileDialog1.Filter=“DLL文件|*.DLL”;
OpenFileDialog1.Title=“选择一个Dll文件”;
if(OpenFileDialog1.ShowDialog()==System.Windows.Forms.DialogResult.OK)
{
//将所选结果放入全局变量中
//~~使用字典而不是列表~~
fullFileName=新字典(OpenFileDialog1.FileNames);
//从字典填充列表框。
listBox2.Datasource=fullFileName.ToList();
listBox2.DisplayMember=“值”;
listBox2.ValueMember=“Key”;
}
}
这就假设您可以将OpenFileDialog1对象更改为返回字典而不是列表
然后您只需使用listBox2.SelectedValue来获取目录。假设这是一个WinForms应用程序而不是WPF,那么您有两个选项 如果“fullFileName”变量是类变量,则当用户在列表框中选择一项时,可以在fullFileName变量中的完整DLL路径中循环,直到找到匹配的文件名
private void listBox1_SelectedIndexChanged(object sender, System.EventArgs e)
{
string curItem = listBox1.SelectedItem.ToString();
foreach( var path in fullFileName)
{
if (System.IO.Path.GetFileName(path).Equals(curItem, StringComparison.OrdinalIgnoreCase))
{
MessageBox.Show("Full path = " + path);
break;
}
}
}
另一个选项是将列表框的数据源设置为包含DLL名称和完整路径的对象列表。然后使用SelectedItemChanged事件(而不是SelectedIndexChanged),SelectedItem将指向完整路径
public class AssemblyItem
{
public string Name {get;set;}
public string FullPath {get;set;}
}
private void materialFlatButton3_Click_1(object sender, EventArgs e)
{
// Use your existing code to get the selection of DLLs
List<AssemblyItem> items = new List<AssemblyItem>();
foreach (string fileName in fullFileName)
{
items.Add(new AssemblyItem()
{
Name = System.IO.Path.GetFileName(fileName),
FullPath = fileName
};
}
listBox1.DataSource = items;
listBox1.DisplayMember = "Name";
listBox1.ValueMember = "FullPath";
listBox1.BindData();
公共类AssemblyItem
{
公共字符串名称{get;set;}
公共字符串完整路径{get;set;}
}
私有无效材质平面按钮3\u单击\u 1(对象发送者,事件参数e)
{
//使用现有代码获取DLL的选择
列表项=新列表();
foreach(fullFileName中的字符串文件名)
{
items.Add(新的AssemblyItem()
{
Name=System.IO.Path.GetFileName(文件名),
完整路径=文件名
};
}
listBox1.DataSource=项目;
listBox1.DisplayMember=“Name”;
listBox1.ValueMember=“完整路径”;
listBox1.BindData();
}
顺便说一句,我建议使用System.IO.Path中的方法从路径中获取文件名,而不是使用LastIndexOf