2017-03-20 7 views
0

DLLをListBoxにロードするアプリケーションを作成しています。これは、ユーザーがボタンを押した後、ユーザーがファイルを開いてリストビューにロードできるようにします。DLLをListBoxにロードした後のDLLのパスを取得する方法

だから、このようになります。

enter image description here

DLL

は、彼らが自分自身にし、リストボックスにそれを追加し、ユーザーのファイルを開いて中に追加されます。

私の質問です。 MaterialSkin.dllへの正確なパスを取得し、誰かがListBoxで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)); 
        } 


       } 
      } 

答えて

1

可能であれば、OpenFileDialog1がファイル名を取得するときにパスを取得するよう調整します。次に、リストの代わりに辞書を使用すると、.dll名だけである表示メンバーを表示することができ、valueメンバーには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";  
       } 
      } 

これは、あなたがリストの代わりに辞書を返すために、あなたのOpenFileDialog1オブジェクトを変更することができます仮定します。

次に、listBox2.SelectedValueを使用してdirを取得します。

0

正確なパスはOpenFileDialog1.FileNamesからあなたに来る...

は、だからリストボックスを移入しているように、キーが現在のインデックスに対応した辞書で完全なパスを格納します。リストボックス内の項目を選択すると、その項目を使用して辞書検索が実行されます。

0

これはWPFではなくWinFormsアプリケーションであると仮定すると、いくつかのオプションがあります。

'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の名前とフルpath.Thenの両方を含むSelectedItemChangedイベント(ではないのSelectedIndexChanged)を使用するオブジェクトのリストにリストボックスのDataSourceを設定されているとの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(); 

}

ところで、私が代わりのlastIndexOfを使用してのパスからファイル名を取得するにはSystem.IO.Pathのメソッドを使用することをお勧めします。

関連する問題