3

我试图通过单击一个按钮(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);
        }
   }
}

主要形式

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

4 回答 4

4

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

Search content = new Search();

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

private void btnsearch_Click(object sender, EventArgs e)
{
 if(btnSearchClicked != null)
       btnSearchClicked(sender, e);
}
于 2013-04-30T07:17:08.187 回答
3

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

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

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

您将不得不阅读一些关于 C# 的教程

编辑:

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

因为您正在尝试使用不存在的东西(为空),所以您会遇到异常。

于 2013-04-30T07:15:15.730 回答
1

要尝试扩展 Habib 的答案(我打算将此作为评论发布,但它有点冗长),您首先Search在此处创建一个实例并注册该事件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_LoadSearchClicked

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;

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

于 2013-04-30T07:54:38.110 回答
0

使用 SearchClicked 方法从 formMain_Load 共享 Search 实例

主要形式

 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);
        }
   }
于 2013-04-30T09:06:27.650 回答