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; }
    }

我已经意识到它正在从“Key”命令中添加艺术家姓名的值:listBox3.Items.Add(pair.Key);

但是我不知道将其更改为..任何帮助都非常感谢:)

4

5 回答 5

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

很难确定,但似乎您希望在 foreach 循环中这样做:

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

此外,由于mem您的构造函数中的参数是第一个,您可能想要交换您传入的内容,以便它对齐:

new Book(txtIsbn.Text, txtArtist.Text)

这是假设txtArtist.Text包含您想要的值Artist,并且txtIsbn.Text包含您想要的值MEM

作为旁注,清理名称是值得的,这将使以后更容易发现问题。

于 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

您的音乐词典包含按艺术家姓名排列的书籍。
所以key是书名,value是书名。
正确的做法是:

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

无需捕获异常,只需检查 book 是否已添加到字典中。还将书籍设置为列表框的数据源,而不是手动将它们添加到项目中:

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 回答