C# 如何在加载到列表框后获取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

我正在创建一个将DLL加载到列表框中的应用程序。它是通过用户按下按钮来实现的,然后用户可以打开文件,并将其加载到listview中

所以看起来像这样

DLL是通过打开用户文件添加的,然后用户自己将其添加到列表框中

我的问题是。当有人在列表框中选择MaterialSkin.dll时,如何获取MaterialSkin.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
                    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