2013-04-30 31 views
3

我試圖通過單擊按鈕(btnsearch_Click)來訪問我主窗體中的事件,每次單擊它時,都會顯示'對象引用未設置爲對象的實例'。NullReferenceException未處理 - 什麼是空?

這裏是我的代碼:

用戶控件

namespace Purchase_Order 
{ 
    public partial class Search : UserControl 
    { 
     public event EventHandler btnSearchClicked; 

     public Search() 
     { 
      InitializeComponent(); 
     } 
     private void btnsearch_Click(object sender, EventArgs e) 
     { 

      btnSearchClicked(sender, e); 
     } 
    } 
} 

主要形式

namespace Purchase_Order 
{ 
    public partial class formMain : Form 
    { 

     public formMain() 
     { 
      InitializeComponent();    
     } 




private void formMain_Load(object sender, EventArgs e) 
     { 

Search searchbox = new Search(); 
searchbox.btnSearchClicked += new EventHandler(SearchClicked); 
} 


void SearchClicked(object sender, EventArgs e) 
     { 
      MySqlConnection con = new MySqlConnection(serverstring); 

      try 
      { 

       string query = "SELECT * FROM tblclassification WHERE INSTR(class_name, @search)"; 

       MySqlCommand cmd = new MySqlCommand(query, con); 
       MySqlDataAdapter da = new MySqlDataAdapter(cmd); 

       Search content = new Search(); 
       cmd.Parameters.AddWithValue("@search", content.btnsearch.Text); 

       DataTable dt = new DataTable(); 
       da.Fill(dt); 


       classification control = new classification(); 
       control.dataGridView1.DataSource = dt; 
       control.dataGridView1.DataMember = dt.TableName; 

       panelMain.Controls.Clear(); 
       panelMain.Controls.Add(control); 
       MessageBox.Show("OK"); 

      } 
      catch (Exception) 
      { 
       throw; 
      } 
      finally 
      { 
       if (con.State == ConnectionState.Open) 
       { 
        con.Close(); 
       } 
      }  
     } 
+1

凡'serverstring'初始化? – 2013-04-30 07:16:28

+2

你可以看到在哪一行使用visual studio調試器拋出的錯誤 – 2013-04-30 07:19:48

+0

@AntP對不起,我忘了複製服務器字符串代碼,這裏是: string serverstring =「user id = root; password =; server = localhost; database = purchase_order;連接超時= 3;「; – Harvey 2013-04-30 07:21:05

回答

1

要嘗試和擴大Habib的回答一點(我會張貼此作爲發表評論,但它是一個漫長的一點),你首先創建的Search一個實例,並在formMain_Load這裏登記的事件:

private void formMain_Load(object sender, EventArgs e) 
{ 
    Search searchbox = new Search(); 
    searchbox.btnSearchClicked += new EventHandler(SearchClicked); 
} 

這是所有的F恩和丹迪。然而,在SearchClicked,爲您打造一個Search例如像這樣:

Search content = new Search(); 

這是一個單獨對象你formMain_Load創建的,你永遠不註冊事件給該對象。它看起來像你想要做的是從formMain_LoadSearchClicked方法共享Search實例。要做到這一點,在你的代碼隱藏創建一個屬性:

public partial class formMain : Form 
{ 
    private Search _searchbox; 
    ... 
} 

然後,在formMain_Load

private void formMain_Load(object sender, EventArgs e) 
{ 
    _searchbox = new Search(); 
    _searchbox.btnSearchClicked += new EventHandler(SearchClicked); 
} 

現在,你可以重複使用,通過改變這SearchClicked註冊的情況下,本對象:

Search content = new Search(); 

對此:

Search content = _searchbox; 

您應該發現異常消失。希望這將提供更多的見解,並將幫助您瞭解錯誤的原因以及如何規避錯誤。

+0

我試過了,它能正常工作。對不起,我的無意義的問題,但謝謝你仍然幫助我。 – Harvey 2013-04-30 08:36:14

3

這意味着你沒有得到你想要的類型的實例使用。

public event EventHandler btnSearchClicked;只是您要使用的「真實」對象的參考。

這就像你試圖打開一個房子的門,你只有一個藍圖。這是不可能的(至少不是在我們的宇宙中)。您首先需要建造房屋,然後嘗試進入。類似這樣的情況就是你的問題。

您必須閱讀有關C#中的一些教程

編輯:

關於空的事情是,沒有什麼你有參考指向了。如果你還沒有創建任何東西,那麼沒有任何可以引用的東西...

因爲你試圖使用不存在的東西(爲空),你會得到一個異常。

+0

問題是「什麼是null」,而不是「null是什麼意思?」 – 2013-04-30 07:16:09

+2

@AntP問題是有點模糊,我不認爲他值得-1。 – 2013-04-30 07:18:36

+0

@TheodorosChatzigiannakis是的,你可能是對的。 – 2013-04-30 07:20:43

4

您正在用SearchClicked方法創建用戶控件的新實例,並且您沒有針對它註冊事件。

Search content = new Search(); 

而且它的更好,如果你檢查任何控件是否有提高它像之前註冊事件:

private void btnsearch_Click(object sender, EventArgs e) 
{ 
if(btnSearchClicked != null) 
     btnSearchClicked(sender, e); 
} 
+0

我已經在行中註冊了它 - > Search content = new Search();你什麼意思? – Harvey 2013-04-30 07:40:21

+0

@ user2083771,你沒有在這個實例中註冊事件'btnSearchClicked'。你可以註冊這個事件,比如'content.btnSearchClicked + = new EventHandler(SearchClicked);'或者使用前面在表單加載中創建的usercontrol。定義在課堂級別,然後你可以在兩種方法中使用 – Habib 2013-04-30 07:47:44

+0

好吧,所以我添加了代碼'Search content = new Search(); content.btnSearchClicked + = new EventHandler(SearchClicked);'在我的主要形式SearchClicked函數,但它顯示相同的錯誤。 – Harvey 2013-04-30 07:55:02

0

分享從formMain_Load搜索實例與SearchClicked方法

主要形式

public partial class formMain : Form 
    { 
     private Search _searchbox; 
     ... 

private void formMain_Load(object sender, EventArgs e) 
{ 
    _searchbox = new Search(); 
    _searchbox.btnSearchClicked += new EventHandler(SearchClicked); 
} 

void SearchClicked(object sender, EventArgs e) 
     { 


    Search content = _searchbox; 

MySqlConnection con = new MySqlConnection(serverstring); 

      try 
      { 

       string query = "SELECT * FROM tblclassification WHERE INSTR(class_name, @search)"; 

       MySqlCommand cmd = new MySqlCommand(query, con); 
       MySqlDataAdapter da = new MySqlDataAdapter(cmd); 


       cmd.Parameters.AddWithValue("@search", content.btnsearch.Text); 

       DataTable dt = new DataTable(); 
       da.Fill(dt); 


       classification control = new classification(); 
       control.dataGridView1.DataSource = dt; 
       control.dataGridView1.DataMember = dt.TableName; 

       panelMain.Controls.Clear(); 
       panelMain.Controls.Add(control); 
       MessageBox.Show("OK"); 

      } 
      catch (Exception) 
      { 
       throw; 
      } 
      finally 
      { 
       if (con.State == ConnectionState.Open) 
       { 
        con.Close(); 
       } 
      }  
      } 
     } 

用戶控件

public partial class Search : UserControl 
    { 
     public event EventHandler btnSearchClicked; 

     public Search() 
     { 
      InitializeComponent(); 
     } 
     private void btnsearch_Click(object sender, EventArgs e) 
     { 

      btnSearchClicked(sender, e); 
     } 
    } 
相關問題