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

这是怎么发生的?

+0

** **在哪里做你的错误?你使用了调试器吗? – SLaks

+0

它发生在我单击窗体上的确定后,catch {}就会看到它。 JIT编译器告诉我这一点。 – iggy2012

+0

你在哪里设置值为'Book'?用你显示的代码看起来你试图设置一个空的对象的属性,你没有为它设置一个值。 – BrunoLM

看起来您从未将LibraryBook实例放入Book属性中。

+0

我该如何补救? (我是新窗口窗体) – iggy2012

+0

没关系。我看到我需要初始化LibraryBook对象。 – iggy2012

您需要初始化Book属性。它从来没有被设置为一个值,所以当你使用它的时候它会是null

你可以做这样的事情。

public LibraryBook Book 
{ 
    get 
    { 
     if (book == null) 
     { 
      book = new LibraryBook(); 
     } 
     return book; 
    } 
    set { book = value;} 
} 
+0

我已经这样做了,它似乎解决了这个问题,但现在当我看到listBox时,它显示为一个元素(我可以点击它),但它只是一个空白字符串(toString )?还是因为对象没有创建?)。为什么会发生这种情况? – iggy2012

+1

'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

+0

我希望人们对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); 
     } 
    } 
}