将 Textbox 事件从 Form 传递到 Class 时为空引用
Null Reference when passing Textbox event from Form to Class
我有以下代码:
在表格中:
public void filterType_TextChanged(object sender, EventArgs e)
{
var dSearch = new D_Search(this);
dSearch.filterD(sender);
}
所以我有一个文本框事件,我在其中调用另一个 class dSearch 中的 filterD 函数。在 class dSearch 中我有:
public D_Search(Form1 frm1)
{
form1 = frm1;
}
public String filterD(object sender)
{
string val = String.Empty;
if (sender == form1.filterType())
{
val = (sender as TextBox).Text;
//havent written the whole SQL Command here
sqlCmd = new SqlCommand("SELECT * FROM, connection);
}
datTable = new DataTable();
sqlDatAdapter = new SqlDataAdapter(sqlCmd.CommandText,
connection); //causes NullReferenceException
sqlDatAdapter.Fill(datTable);
form1.setDataGrid = datTable;
return val;
}
所以我的表单中有多个函数,例如 filterType,它们是文本框事件。现在我想将它们传递给我的 Class,它应该通过 if 语句注意到调用了什么事件(更改了什么文本框),但我在 sqlDatAdapter 处收到 NullReference 异常。我该怎么办?
编辑:cmd 为空。另外:
这里是 filterType 函数:
public String filterType()
{
return filterTypeNumber.Text;
}
EDIT2: 没有使用if语句,所以他不识别发件人,因为他比较发件人是否是文本框条目。我该怎么办?
您没有打开连接
Con.OPen();
//logic here
cmd.ExecuteNonQuery();
Con.Close();
//数据驻留在sqlCmd对象中
sqlCmd = new SqlCommand("SELECT * FROM, connection);
尝试将 sqlCmd 作为参数传递
sqlDatAdapter = new SqlDataAdapter(sqlCmd,connection);
确保您已实例化 connection
,因此它不为空。假设这不是您的问题,在我看来您可能从 sqlCmd
获取 NullRefEx,当 (sender == form1.filterType())
为 false 时可能不会实例化。如果是这样,你应该可以通过稍微移动一下来解决它,例如:
// Make the table available outside the if-else, even if it is empty:
datTable = new DataTable();
if (sender == form1.filterType())
{
val = (sender as TextBox).Text;
//havent written the whole SQL Command here
sqlCmd = new SqlCommand("SELECT * FROM, connection);
// Only do this if it is relevant, i.e. here within the if-structure,
// that way, you should be able to avoid the nullRef:
sqlDatAdapter = new SqlDataAdapter(sqlCmd.CommandText, connection);
sqlDatAdapter.Fill(datTable);
}
// You might have to check something extra here, depending on
// usage, since the table might be empty:
form1.setDataGrid = datTable;
更新回复评论:
我不确定我是否了解您的意思,但是如果您想再次将 sqlCmd 移出,那很好 - 只需确保它不为 null,即使 sender == form1.filterType()
为 false。如果在实例化 SqlDataAdapter
之前要用其他内容填充 sqlCmd.CommandText
,请确保先执行此操作。否则,您可能会做类似下面的事情,并将所有这些放在另一个 if
-结构之外:
if(sqlCmd != null && !String.IsNullOrEmpty(sqlCmd.CommandText)){
sqlDatAdapter = new SqlDataAdapter(...)
...
}
无论哪种方式,您都必须通过以下两种方式之一避免空引用:填充 sqlCmd
,使其不为空,或者避免调用它。
因此将您的 IF 语句更改为;
if ( (sender as TextBox).Text== form1.filterType())
{
//havent written the whole SQL Command here
sqlCmd = new SqlCommand("SELECT * FROM, connection);
}
还要确保连接已打开。
希望对您有所帮助..!!!
我有以下代码:
在表格中:
public void filterType_TextChanged(object sender, EventArgs e)
{
var dSearch = new D_Search(this);
dSearch.filterD(sender);
}
所以我有一个文本框事件,我在其中调用另一个 class dSearch 中的 filterD 函数。在 class dSearch 中我有:
public D_Search(Form1 frm1)
{
form1 = frm1;
}
public String filterD(object sender)
{
string val = String.Empty;
if (sender == form1.filterType())
{
val = (sender as TextBox).Text;
//havent written the whole SQL Command here
sqlCmd = new SqlCommand("SELECT * FROM, connection);
}
datTable = new DataTable();
sqlDatAdapter = new SqlDataAdapter(sqlCmd.CommandText,
connection); //causes NullReferenceException
sqlDatAdapter.Fill(datTable);
form1.setDataGrid = datTable;
return val;
}
所以我的表单中有多个函数,例如 filterType,它们是文本框事件。现在我想将它们传递给我的 Class,它应该通过 if 语句注意到调用了什么事件(更改了什么文本框),但我在 sqlDatAdapter 处收到 NullReference 异常。我该怎么办?
编辑:cmd 为空。另外:
这里是 filterType 函数:
public String filterType()
{
return filterTypeNumber.Text;
}
EDIT2: 没有使用if语句,所以他不识别发件人,因为他比较发件人是否是文本框条目。我该怎么办?
您没有打开连接
Con.OPen();
//logic here
cmd.ExecuteNonQuery();
Con.Close();
//数据驻留在sqlCmd对象中
sqlCmd = new SqlCommand("SELECT * FROM, connection);
尝试将 sqlCmd 作为参数传递
sqlDatAdapter = new SqlDataAdapter(sqlCmd,connection);
确保您已实例化 connection
,因此它不为空。假设这不是您的问题,在我看来您可能从 sqlCmd
获取 NullRefEx,当 (sender == form1.filterType())
为 false 时可能不会实例化。如果是这样,你应该可以通过稍微移动一下来解决它,例如:
// Make the table available outside the if-else, even if it is empty:
datTable = new DataTable();
if (sender == form1.filterType())
{
val = (sender as TextBox).Text;
//havent written the whole SQL Command here
sqlCmd = new SqlCommand("SELECT * FROM, connection);
// Only do this if it is relevant, i.e. here within the if-structure,
// that way, you should be able to avoid the nullRef:
sqlDatAdapter = new SqlDataAdapter(sqlCmd.CommandText, connection);
sqlDatAdapter.Fill(datTable);
}
// You might have to check something extra here, depending on
// usage, since the table might be empty:
form1.setDataGrid = datTable;
更新回复评论:
我不确定我是否了解您的意思,但是如果您想再次将 sqlCmd 移出,那很好 - 只需确保它不为 null,即使 sender == form1.filterType()
为 false。如果在实例化 SqlDataAdapter
之前要用其他内容填充 sqlCmd.CommandText
,请确保先执行此操作。否则,您可能会做类似下面的事情,并将所有这些放在另一个 if
-结构之外:
if(sqlCmd != null && !String.IsNullOrEmpty(sqlCmd.CommandText)){
sqlDatAdapter = new SqlDataAdapter(...)
...
}
无论哪种方式,您都必须通过以下两种方式之一避免空引用:填充 sqlCmd
,使其不为空,或者避免调用它。
因此将您的 IF 语句更改为;
if ( (sender as TextBox).Text== form1.filterType())
{
//havent written the whole SQL Command here
sqlCmd = new SqlCommand("SELECT * FROM, connection);
}
还要确保连接已打开。
希望对您有所帮助..!!!