あなたがC#7の新しいタプルを使用することができますと仮定:
private Dictionary<string, (string image, List<string> books)> books = new Dictionary<string, (string image, List<string> books)>
{
{ "Programming", ("programming.png", new List<string> { "Visual Basic", "Java", "C#"}) },
{ "Networking", ("networking.png", new List<string> {"LAN Networks", "Windows Networking", "More About Networking"}) },
{ "Web", ("html.png", new List<string> {"Web Programming", "Javascript", "ASP"}) }
};
private void bookComboBox_SelectedIndexChanged(object sender, EventArgs e)
{
// sets books to the clicked item
string book = bookComboBox.SelectedItem.ToString();
selectedPictureBox.Visible = true;
if (books.Keys.Contains(book))
{
bookListBox.Items.Clear();
selectedPictureBox.Image = Image.FromFile(books[book].image);
foreach(var b in books[book].books)
{
bookListBox.Items.Add(b);
}
}
}
しかし、クラスはさらに良いそうです:
すべて今使用して、異なるではありませんが、それは形式化し
public class BookGroup
{
public string ImagePath {get;set;}
public List<string> Books {get;}
public BookGroup(string imagePath, params string[] books)
{
ImagePath = imagePath;
Books = new List<string>(books.Length);
Books.AddRange(books);
}
}
このコードを道路で簡単に使用できるようにするものがいくつかあります。タプルをまだ使用できない場合は可能です。また、私はちょうど楽しみのために、今のところ、それ自体でBook
クラスを持っているかもしれません:
private Dictionary<string, BookGroup> books = new Dictionary<string, BookGroup>
{
{ "Programming", new BookGroup("programming.png", "Visual Basic", "Java", "C#")},
{ "Networking", new BookGroup("networking.png","LAN Networks", "Windows Networking", "More About Networking") },
{ "Web", new BookGroup("html.png", "Web Programming", "Javascript", "ASP") }
};
private void bookComboBox_SelectedIndexChanged(object sender, EventArgs e)
{
// sets books to the clicked item
string book = bookComboBox.SelectedItem.ToString();
selectedPictureBox.Visible = true;
if (books.Keys.Contains(book))
{
bookListBox.Items.Clear();
BookGroup bg = books[book];
selectedPictureBox.Image = Image.FromFile(bg.ImagePath);
foreach(var b in bg.Books)
{
bookListBox.Items.Add(b);
}
}
}
かかわらず、私は間違いなくは、テキストファイルからこれらをロードする方法を持ってをいただきたい...そうCSV、新しいプロセスコードを再コンパイルまたは配布しなくてもこのリストを更新することができます。そのことを念頭に置いて、このデータを1つのファイルにまとめるために、画像を繰り返して各書籍を入力すると、CSVデータは次のようになります。
Topic,Image,Title
Programming,programming.png,"Visual Basic"
Programming,programming.png,"Java"
Programming,programming.png,"C#"
Networking,networking.png,"LAN Networks"
Networking,networking.png,"Windows Networking"
Networking,networking.png,"More About Networking"
Web,html.png,"Web Programming"
Web,html.png,"Javascript"
Web,html.png,"ASP"
これは、コードの文字全体を変更します。私は少しバイアスされんだけど、私はそうthis CSV Parserを使用したい、そして再び私はこのような何かを生産したいタプルを仮定:
private List<(string Topic, string ImagePath, string Title)> books;
//In the form load code:
books = EasyCSV.FromFile("bookData.csv").Select(b => (b[0], b[1], b[2])).ToList();
//and finally, in the original selectindexchanged method:
private void bookComboBox_SelectedIndexChanged(object sender, EventArgs e)
{
string topic = bookComboBox.SelectedItem.ToString();
selectedPictureBox.Visible = true;
var items = books.Where(b => b.Topic == topic).ToArray();
if(items.Length > 0)
{
bookListBox.Items.Clear();
selectedPictureBox.Image = Image.FromFile(items[0].ImagePath);
bookListBox.Items.AddRange(items);
}
}
データストアを使用してアイテムを格納することをお勧めします。キーが本の種類で、リストボックスを構築するためにそのデータをプルする辞書のようなもの – Colwin
はい。まずif-elseの外でbookListBox.Items.Clear()を取り出します。状態が始まる前に置く。 2番目の画像ファイル名のみを格納する変数を宣言し、この変数名を各条件のファイル名に設定し、このファイル名を条件外のpictureboxに割り当てます。 3番目に、ブックアイテムを格納するリストを作成し、bookListBoxデータソースをそれらのリストに割り当てます。 –
@BhubanShresthaサンプルコードでは、これらのオプションと一致しないコンボボックス項目が存在する可能性があるため、リスト外では移動しません。 –