C# 未处理NullReferenceException-什么是null?

C# 未处理NullReferenceException-什么是null?,c#,winforms,C#,Winforms,我试图通过单击按钮(btnsearch_Click)来访问主窗体中的事件,每次单击它时,它都会显示“对象引用未设置为对象的实例” 这是我的密码: 用户控制 namespace Purchase_Order { public partial class Search : UserControl { public event EventHandler btnSearchClicked; public Search() {

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

这是我的密码:

用户控制

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

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

已单击公共事件事件处理程序btnsearch只是要使用的“真实”对象的参考

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

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

编辑:

关于null的问题是,您的引用也没有指向任何内容。如果您还没有创建任何内容,那么就没有任何内容可供参考


因为您试图使用不存在的东西(为null),所以您将得到一个异常

您正在
SearchClicked
方法中创建用户控件的新实例,并且未针对该实例注册事件

Search content = new Search();
如果在引发事件之前检查是否有任何控件注册了事件,则更好,如:

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

为了尝试对Habib的答案进行一点扩展(我本来打算将此作为评论发布,但有点冗长),首先创建一个
Search
实例,并在
formMain\u Load
中注册事件,如下所示:

private void formMain_Load(object sender, EventArgs e)
{
    Search searchbox = new Search();
    searchbox.btnSearchClicked += new EventHandler(SearchClicked);
}
这一切都很好。但是,在单击的
Search
中,您创建了
Search
新实例,如下所示:

Search content = new Search();
这是一个与您在
formMain\u Load
中创建的对象相分离的对象,并且您从未将事件注册到此对象。看起来您要做的是使用
SearchClicked
方法从
formMain\u Load
共享
Search
实例。为此,请在codebehind中创建一个属性:

public partial class formMain : Form
{
    private Search _searchbox;
    ...
}
然后,在
formMain\u 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;

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

使用SearchClicked方法从formMain\u Load共享搜索实例

主表单

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();
                }
            }    
        }
 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();
                }
            }    
            }
        }
用户控制

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);
        }
   }
}
public partial class Search : UserControl
    {
        public event EventHandler btnSearchClicked;

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

           btnSearchClicked(sender, e);
        }
   }

问题是“什么是空的”,而不是“空意味着什么?”@AntP这个问题有点含糊不清,我认为他不应该得到-1。serverstring在哪里初始化?你能看到使用visual studio在哪一行抛出错误吗debugger@AntP很抱歉,我忘了复制serverstring代码,这是:string serverstring=“用户id=根用户;密码=;服务器=本地主机;数据库=采购订单;连接超时=3;“;@CodeIgnoto,它在->btnSearchClicked(sender,e);@AntP,我把这行代码->searchbox.btnSearchClicked+=neweventhandler(SearchClicked);放在formMain\u Load事件中,对吗?我已经在->Search content=new Search()行中注册了它;您的意思是什么?@user2083771,您没有向此实例注册事件
btnSearchClicked
。您可以注册事件,如
content.btnSearchClicked+=new EventHandler(SearchClicked);
或使用前面在表单加载中创建的usercontrol。在类级别定义它,然后在两种方法中都可以使用它。因此,我添加了代码
Search content=new Search();content.btnSearchClicked+=new EventHandler(SearchClicked);
在我的主窗体SearchClicked函数中,但它显示相同的错误。@用户2083771,使用类级对象进行
搜索
,您正在事件内部创建指令。相同的错误,先生,这是我的代码,在类formMain
搜索内容=新搜索()下;void SearchClicked(对象发送者,事件参数e){content.btnSearchClicked+=neweventhandler(SearchClicked);}
我已经尝试过了,而且效果很好。很抱歉我提出了一个没有意义的问题,但感谢您仍然帮助我。