C#在表单之间传递对象
所以我有两种形式。 LibraryBookDialog.cs和MainForm.cs。我试图将一个对象从LibraryBookDialog.cs传递给Mainform.cs。问题是,当我尝试这样做,我得到这个错误...C#在表单之间传递对象
object reference not set to an instance of the object
这里是我的两种形式...
LibraryBookDialog.cs:
private LibraryBook book;
public LibraryBook Book
{
get { return book;}
set { book = value;}
}
private void buttonOk_Click(object sender, EventArgs e)
{
if (validateData())
{
try
{
Book.Title = textBoxTitle.Text;
Book.Author = textBoxAuthor.Text;
Book.CopyrightYear = Convert.ToInt32(textBoxCopyrightYear.Text);
this.DialogResult = DialogResult.OK;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "There was an error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
和MainForm.cs
private void buttonNew_Click(object sender, EventArgs e)
{
LibraryBookDialogue dlg = new LibraryBookDialogue();
dlg.ShowDialog();
if (dlg.DialogResult == DialogResult.OK)
{
listBoxLibraryBooks.Items.Add(dlg.Book);
}
dlg.Dispose();
}
这是怎么发生的?
您需要初始化Book
属性。它从来没有被设置为一个值,所以当你使用它的时候它会是null
。
你可以做这样的事情。
public LibraryBook Book
{
get
{
if (book == null)
{
book = new LibraryBook();
}
return book;
}
set { book = value;}
}
我已经这样做了,它似乎解决了这个问题,但现在当我看到listBox时,它显示为一个元素(我可以点击它),但它只是一个空白字符串(toString )?还是因为对象没有创建?)。为什么会发生这种情况? – iggy2012
'listBoxLibraryBooks'最有可能不知道如何解析你的'LibraryBook'对象,所以你需要在'listBoxLibraryBooks'上设置属性,如:'listBoxLibraryBooks.ValueMember = LibraryBook.ID'(值是什么,例如:ID)和'listBoxLibraryBooks.DisplayMember = LibraryBook.Title'(显示在GUI上)。查看这些页面以获取更多信息:[ValueMember](http://msdn.microsoft.com/zh-cn/library/system.windows.forms.listcontrol.valuemember.aspx)和[DisplayMember](http:// msdn。 microsoft.com/en-us/library/system.windows.forms.listcontrol.displaymember.aspx) – John
我希望人们对downvote发表评论。懒惰的初始化可能不是最好的(不知道你的情况),但我会自信地推荐它重新初始化每个按钮点击。 –
private LibraryBook book = new LibraryBook();
或
private void buttonOk_Click(object sender, EventArgs e)
{
if (validateData())
{
try
{
// Create book instance and assign properties
Book = new LibraryBook()
{
Title = textBoxTitle.Text,
Author = textBoxAuthor.Text,
CopyrightYear = Convert.ToInt32(textBoxCopyrightYear.Text)
};
this.DialogResult = DialogResult.OK;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "There was an error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
** **在哪里做你的错误?你使用了调试器吗? – SLaks
它发生在我单击窗体上的确定后,catch {}就会看到它。 JIT编译器告诉我这一点。 – iggy2012
你在哪里设置值为'Book'?用你显示的代码看起来你试图设置一个空的对象的属性,你没有为它设置一个值。 – BrunoLM