C# 未处理NullReferenceException-什么是null?
我试图通过单击按钮(btnsearch_Click)来访问主窗体中的事件,每次单击它时,它都会显示“对象引用未设置为对象的实例” 这是我的密码: 用户控制C# 未处理NullReferenceException-什么是null?,c#,winforms,C#,Winforms,我试图通过单击按钮(btnsearch_Click)来访问主窗体中的事件,每次单击它时,它都会显示“对象引用未设置为对象的实例” 这是我的密码: 用户控制 namespace Purchase_Order { public partial class Search : UserControl { public event EventHandler btnSearchClicked; public Search() {
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);}
我已经尝试过了,而且效果很好。很抱歉我提出了一个没有意义的问题,但感谢您仍然帮助我。