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

还要确保连接已打开。

希望对您有所帮助..!!!