1

次のフォームを作成しましたが、メンバー数リストボックスにメンバー数を表示する際に問題が発生しました。これは、[アーティストを追加] ボタンを押す前のスクリーンショットです。

ここに画像の説明を入力

アーティストの数ではなくアーティスト名の内容を使用していることがわかります。

ここに画像の説明を入力

form1のコードは次のとおりです。

 public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    Dictionary<String, Book> music = new Dictionary<String, Book>();

    private void btnAdd_Click(object sender, EventArgs e)
    {
        if ((txtIsbn.Text != "") & (txtArtist.Text != "")) // if text artist name and number of artists is present
        {
            try { music.Add(txtArtist.Text, new Book(txtArtist.Text, txtIsbn.Text)); } //txtArtist
            catch { MessageBox.Show("Already Exist!!"); }
        }
        else MessageBox.Show("Please fill in both Artist Name and Number of Members");

        listBox1.Items.Clear();
        listBox2.Items.Clear();
        listBox3.Items.Clear();
        foreach (var pair in music)
        {
            listBox1.Items.Add(pair.Key);
            //listBox2.Items.Add(pair.Value.Onloan);
            listBox3.Items.Add(pair.Key);
        }
    }

そして、これがArtistクラスのコードです(以前に作成したプログラムを編集したため、bookと呼ばれます):

class Book
{
    private String mem; //mem = number of members
    private string artist;
   

    public Book(string mem, string artist)
    {
        this.mem = mem;
        this.artist = artist;
    }

    public string MEM
    {
        get { return mem; }
        set { mem = value; }
    }

    public string Artist
    {
        get { return artist; }
        set { artist = value; }
    }

「キー」コマンドからアーティスト名の値を追加していることに気付きました: listBox3.Items.Add(pair.Key);

しかし、私はそれを何に変更すればよいかわかりません..どんな助けも大歓迎です:)

4

5 に答える 5

1

アーティスト名別の本を含む音楽辞書があります。
したがって、キーは本の名前で、値は本です。
それを行う正しい方法は次のとおりです。

foreach (var pair in music)
{
    var book = pair.Value;
    listBox1.Items.Add(book.Artist);
    listBox3.Items.Add(book.MEM);
}
于 2013-03-19T21:33:20.617 に答える
1

確かに言うのは難しいですが、 foreach ループ内でこれが必要なようです:

listBox3.Items.Add(pair.Value.MEM);

また、memコンストラクターの引数が最初にあるため、渡すものを並べ替えて整列させたいと思うでしょう。

new Book(txtIsbn.Text, txtArtist.Text)

これは、 に必要な値が含まれていること、およびにtxtArtist.Text必要な値が含まれていることを前提としています。ArtisttxtIsbn.TextMEM

補足として、名前をクリーンアップするのは時間の価値があります。後で問題を見つけるのがずっと簡単になります。

于 2013-03-19T21:29:10.650 に答える
1

それ以外の:

foreach (var pair in music)
        {
            listBox1.Items.Add(pair.Key);
            //listBox2.Items.Add(pair.Value.Onloan);
            listBox3.Items.Add(pair.Key);
        }

私はあなたが欲しいと思います:

foreach (var pair in music)
        {
            listBox1.Items.Add(pair.Key);
            //listBox2.Items.Add(pair.Value.Onloan);
            listBox3.Items.Add(pair.Value.MEM );
        }
于 2013-03-19T21:32:06.623 に答える
1

あなたの

    foreach (var pair in music)
    {
        listBox1.Items.Add(pair.Key);
        //listBox2.Items.Add(pair.Value.Onloan);
        Book b = pair.Value;
        listBox3.Items.Add(b.MEM);
    }

MEM プロパティの内容をリストボックスに追加しません。しかし、あなたがそれを設定している場所もわかりません。

于 2013-03-19T21:28:17.603 に答える
1

例外をキャッチする代わりに、書籍がすでに辞書に追加されているかどうかを確認するだけです。アイテムに手動で追加する代わりに、本をリストボックスのデータ ソースとして設定します。

private void btnAdd_Click(object sender, EventArgs e)
{
    if (txtIsbn.Text == "" || txtArtist.Text == "")
    {
       MessageBox.Show("Please fill in both Artist Name and Number of Members");
       return;
    }

    Book book = new Book(txtArtist.Text, txtIsbn.Text);

    if (music.ContainsKey(book.Artist))
    {
        MessageBox.Show("Already Exist!!");
        return;
    }

    music.Add(book.Artist, book);
    var books = music.Values.ToList();   

    listBox1.DisplayMember = "Artist"; // set it in designer
    listBox1.DataSource = books;
    listBox3.DisplayMember = "MEM"; // set it in designer
    listBox3.DataSource = books;
}
于 2013-03-19T21:34:42.843 に答える