2017-03-09 26 views
1

DataSourceがリストであり、フォルダ名を含むリストボックスがあります。私は、リストボックスとパスからフォルダを削除したいが、最初は動作しません。DataSourceでListBoxからアイテムを削除

ここでコード:

private static List<string> themesF; 

public Form1() 
     { 
      InitializeComponent(); 

List<string> dirs = new List<string (System.IO.Directory.GetDirectories(@"Thems")); 
var pngs = System.IO.Directory.GetFiles(@"Thems").Where(s => s.EndsWith(".png")); 
      themesF = new List<string>(); 

      for (int i = 0; i < dirs.Count; i++) 
      { 
       themesF.Add(dirs[i].Substring(6)); 
       Console.WriteLine("A) Directorio " + dirs[i]); 
       Console.WriteLine("B) Carpeta" + themesF[i]); 
      } 
      lb.DataSource = themesF; 
      pbx.ImageLocation = (@"Thems\" + themesF[0] + @"\Preview.png"); 

     } 
private void btnRemove_Click(object sender, EventArgs e) 
    { 
     String folder = lb.SelectedItem.ToString(); 
     themesF.Remove(folder); 
     lb.DataSource = null; 
     lb.DataSource = themesF; 
     System.IO.Directory.Delete(@"Thems\" + folder,true); 

    } 
+0

デバッガを使用して理由を説明します。 'String folder = lb.SelectedItem.ToString();'行に停止を置き、何が起こるかを追う。 – LarsTech

+0

フォルダlb.selecteditem から値を取る「」今、私はヌル lb.selecteditemとしての価値を置く前に lb.datasourceが17フォルダの を持っている「フォルダ」。 themesFには、データソースと同じ17個のフォルダがあります。 私は削除すると、私は16フォルダ、 lb.Datasource = themesFそれは16のフォルダがあります。 選択したアイテムは現在folder1ですが、まだ選択されているフォルダです – Seeker

+0

リストの代わりにBindingListを使用します。クリックイベントでDataSource行を削除します。 – LarsTech

答えて

0

List<T>は、リストへの変更を報告し、その代わりにBindingList<T>を使用してみてくださいしない:これらはもはや必要ではないので

BindingList<string> themesF = new BindingList<string>(); 

はRemove_Clickイベントから、これらのデータソースの行を削除します。 DataSourceを一度設定するだけです。

0

はこれを試してください:あなたは、リストから何かを削除したい場合は

private void btnRemove_Click(object sender, EventArgs e) 
{ 
    string folder = themesF.Find(t=> t.Equals(lb.SelectedItem.Text)); 
    themesF.Remove(folder); 
    lb.DataSource = themesF; 
    System.IO.Directory.Delete(@"Thems\" + folder,true); 

} 

、一つの方法は、最初にそれを見つけることです。 これを書くと、lb.DataSource = something;最初にヌルを置く必要はありません。

+0

これでフォルダは削除されますが、それでもリストボックスに表示されます。 – Seeker

+0

lb.SelectedItem.Text内のテキストがあなたの文字列のテキストの場合、それは削除されます。または、あなたは次のように書くことができます:themesF.Remove(themesF.Find(t => t.Equals(lb.SelectedItem.Text))); 。どちらも同じです –

+0

それはありますが、私はこのフォームがなぜ私にとってうまくいかないのか分かりません。とにかく、コメントに感謝します。 – Seeker

関連する問題