繁体   English   中英

Null forms之间切换时参考

[英]Null reference when switching between forms

我有一个程序,它的主窗体带有 DevExpress XtraGrid 控件。 它有很多行,其中包含来自我的数据库的数据。 我在主窗体上有一个编辑窗体和一个编辑按钮来编辑选定的行。 我能够将所选 object 的信息很好地拉入编辑表单,但由于某种原因,当我运行更新命令时再次执行此操作时遇到问题。 我将主窗体上的选定行称为gridView1.GetFocusedRow() ,这对我的 showAttributes 方法非常有效,但不再有效。

我的代码如下。 它正在返回一个异常,因为“呼叫”是 null。请注意以下几点:如果我只是编辑第一行,我已经尝试执行main.gridView1.Focus()main.gridView1.FocusRowHandle(0) -都没有解决问题。 这似乎告诉我该行仍然正确聚焦,但引用不知何故丢失了。

在 Main.cs 中

    private void btnEdit_Click(object sender, EventArgs e)
    {
        //This is the key, that lets you access an attribute of the selected row. 
        Object obj = gridView1.GetFocusedRow();

        //1) Show NewEdit Form
        Edit edit = new Edit();
        edit.Show();

        //2) Display properties of this object from DB
        edit.showAttributes(obj);
    }

在 Edit.cs 中:

    private void btnSubmit_Click(object sender, EventArgs e)
    {
        Main main = new Main();
        Object obj = main.gridView1.GetFocusedRow();
        try
        {
            performUpdate(obj);
        }
        catch (Exception ex)
        {
            MessageBox.Show("Error: " + ex);
        }
    }

    public void performUpdate(Object call1)
    {
        Main main = new Main();
        CallLog call = new CallLog();
        call = call1 as CallLog;

        executeSQLUpdate(call.Oid);
        main.xpServerCollectionSource1.Reload();
    }

这是 showAttributes 代码 - 做同样的事情但有效

    public void showAttributes(Object call1)
    {
        try
        {
            Main main = new Main();
            CallLog call = new CallLog();
            call = call1 as CallLog;

            txtCompany.Text = call.CompanyName;
            txtFirst.Text = call.FirstName;
            txtMiddle.Text = call.MiddleName;
            txtLast.Text = call.LastName;
            txtPhone.Text = call.PhoneNumber;
            txtFax.Text = call.Fax;
            txtEmail.Text = call.Email;
            txtAttention.Text = call.Attention;
            txtCareOf.Text = call.CareOf;
            txtAddress1.Text = call.Address1;
            txtAddress2.Text = call.Address2;
            txtCity.Text = call.City;
            txtState.Text = call.State;
            txtZip.Text = call.ZipCode;
            txtProvince.Text = call.Province;
            txtCountry.Text = call.Country;
            txtMessage.Text = call.Message;
            txtResponse.Text = call.Response;

            if (call.VIP == 1) { chkVIP.Checked = true; } else { chkVIP.Checked = false; }
            if (call.ThreatCall == 1) { chkThreat.Checked = true; } else { chkThreat.Checked = false; }
            if (call.FollowUp == 1) { chkFollowUp.Checked = true; } else { chkFollowUp.Checked = false; }
            if (call.EscalationRequired == 1) { chkEscalation.Checked = true; } else { chkEscalation.Checked = false; }
        }
        catch (Exception ex)
        {
            MessageBox.Show("Error: " + ex);
            return;
        }
    }

另外...我已经尝试过其他几种方法,没有参数,在不同的位置等。问题是main.gridView1.GetFocusedRow()返回 null。此外,将它作为主窗体中的一系列方法运行不会工作( gridView1.GetFocusedRow()也是空的)。

在 Edit.cs 中你做

    Main main = new Main(); 
    Object obj = main.gridView1.GetFocusedRow(); 

这将创建一个新的 Main 而不显示它,然后尝试从 gridView 显然是空的获取 obj。 在显示的所有代码中重复相同的错误。
此外,创建和使用 CallLog 实例非常混乱。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM