NullReferenceException未处理 - 什么是null?

时间:2013-04-30 07:10:57

标签: c# winforms

我正在尝试通过单击按钮(btnsearch_Click)访问主窗体中的事件,每次单击它时,它都会显示“对象引用未设置为对象的实例”。

这是我的代码:

USER CONTROL

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

4 个答案:

答案 0 :(得分:4)

您正在SearchClicked方法中创建用户控件的新实例,而您没有针对它注册事件。

Search content = new Search();

如果您在提升之前检查是否有任何控件已注册您的事件,那么也会更好:

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

答案 1 :(得分:3)

这意味着您还没有要使用的类型的实例。

public event EventHandler btnSearchClicked;只是您要使用的“真实”对象的参考。

就像你试图打开房子的门,你只有一个蓝图。这实际上是不可能的(至少不在我们的宇宙中)。您首先需要建造房屋,然后尝试进入房屋。这样的事情就是你的问题。

您必须阅读一些关于C#的教程

编辑:

关于null的事情是,你所拥有的引用也没有指向。如果您还没有创建任何内容,那么就没有任何内容可供参考...

因为您正在尝试使用不存在的东西(为空),您将获得异常。

答案 2 :(得分:1)

为了尝试扩展Habib的答案(我将发布此作为评论,但它有点冗长),您首先要创建Search的实例并在{{1}中注册该事件这里:

formMain_Load

这一切都很好,花花公子。但是,在private void formMain_Load(object sender, EventArgs e) { Search searchbox = new Search(); searchbox.btnSearchClicked += new EventHandler(SearchClicked); } 中,您可以像这样创建SearchClicked实例:

Search

这是您在Search content = new Search(); 中创建的单独的对象,您永远不会将事件注册到此对象。看起来您要做的就是使用formMain_Load方法与Search共享formMain_Load个实例。为此,请在代码隐藏中创建一个属性:

SearchClicked

然后,在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();

你会发现异常消失了。希望这会提供更多的见解,并帮助您了解错误的原因以及如何规避错误。

答案 3 :(得分: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();
                }
            }    
            }
        }

USER CONTROL

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

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

           btnSearchClicked(sender, e);
        }
   }