关于窗体构造函数传空值如何解决?

时间:2021-05-12 19:28:24
实现效果为:父窗体中有个datagridview控件,选中其中一行,当点击修改按钮时,弹出子窗体,将选中的一行数据显示在子窗体的textbox控件里,并进行修改。我的问题是,选中的某一行里,其中有一列的值为空,当使用窗体构造函数传递这个空值的时候,就会提示 :未将对象引用设置到对象的实例。该如何解决啊?窗体间怎样传递空值?代码如下:子窗体的代码:
public partial class F_SKTZD : Form
    {
        public static char pd;//保存时判断新增还是修改

        public F_SKTZD()
        {
            InitializeComponent();
        }
        public F_SKTZD(单据表 djb)     //定义子窗体带参数的窗体构造函数
        {
            InitializeComponent();
            if (pd == 'K' || pd == 'U')
            {
                this.textBox单据编号.Text = djb.单据编号;
                this.dateTimePicker1.Value = Convert.ToDateTime(djb.单据日期);
                this.comboBox收款单位.Text = djb.业务单位;
                this.textBox收款账户.Text = djb.业务账户;
                this.textBox收款账号.Text = djb.业务账号;
                this.textBox收款开户行.Text = djb.账号开户行;
                this.textBox往来单位.Text = djb.往来单位;
                this.textBox付款账户.Text = djb.往来账户;
                this.textBox付款账号.Text = djb.往来账号;
                this.textBox付款开户行.Text = djb.往来开户行;
                this.comboBox结算方式.Text = djb.结算方式;
                this.textBox用途.Text = djb.用途;
                this.textBox备注.Text = djb.备注;
                this.textBox制单人.Text = djb.制单人;
                this.textBox审核人.Text = djb.审核人;
            }
            if (pd == 'I')
            {
                this.textBox收款账户.Text = djb.业务账户;
                this.textBox收款账号.Text = djb.业务账号;
                this.textBox收款开户行.Text = djb.账号开户行;
            }
        }
父窗体的修改按钮代码 :
private void 修改_Click(object sender, EventArgs e)
        {
            if (this.dataGridView1.SelectedRows.Count != 0)     //判断是否选中行
            {
                F_Form.F_SKTZD.pd = 'U';//修改标志
                单据表 djb = new 单据表();        // 重载子窗体的构造函数
                djb.单据编号 = this.dataGridView1.CurrentRow.Cells[2].Value.ToString();
                djb.单据日期 = Convert.ToDateTime(this.dataGridView1.CurrentRow.Cells[1].Value.ToString());
                djb.业务单位 = this.dataGridView1.CurrentRow.Cells[3].Value.ToString();
                djb.业务账户 = this.dataGridView1.CurrentRow.Cells[4].Value.ToString();
                djb.业务账号 = this.dataGridView1.CurrentRow.Cells[5].Value.ToString();
                djb.账号开户行 = this.dataGridView1.CurrentRow.Cells[6].Value.ToString();
                djb.往来单位 = this.dataGridView1.CurrentRow.Cells[7].Value.ToString();
                djb.往来账户 = this.dataGridView1.CurrentRow.Cells[8].Value.ToString();
                djb.往来账号 = this.dataGridView1.CurrentRow.Cells[9].Value.ToString();
                djb.往来开户行 = this.dataGridView1.CurrentRow.Cells[10].Value.ToString();
                djb.结算方式 = this.dataGridView1.CurrentRow.Cells[11].Value.ToString();
                djb.用途 = this.dataGridView1.CurrentRow.Cells[14].Value.ToString();
                djb.备注 = this.dataGridView1.CurrentRow.Cells[15].Value.ToString();
                djb.制单人 = this.dataGridView1.CurrentRow.Cells[16].Value.ToString();
                djb.审核人 = this.dataGridView1.CurrentRow.Cells[17].Value.ToString();
                F_Form.F_SKTZD ff = new F_Form.F_SKTZD(djb);//调用子窗体带参数的构造函数
                ff.ShowDialog();
            }
            else
                MessageBox.Show("请选中一行要修改的记录");
        }
每当运行到有空值的地方提示

5 个解决方案

#1


对传入的数据先进行非空验证,然后再进行下一步工作

#2


关于窗体构造函数传空值如何解决?问题是 实际情况确实需要传递空值,有值的时候传递值,无值的时候传递空值

#3


把 djb.备注 = this.dataGridView1.CurrentRow.Cells[15].Value.ToString();
改成djb.备注 = Convert.ToString(this.dataGridView1.CurrentRow.Cells[14].Value);
问题解决 关于窗体构造函数传空值如何解决?
原因是如果使用了.ToString()就必须保证前面的值不为空才能转换,如果为空就永远报错。

#4


引用 3 楼 wang_fuliang 的回复:
把 djb.备注 = this.dataGridView1.CurrentRow.Cells[15].Value.ToString();
改成djb.备注 = Convert.ToString(this.dataGridView1.CurrentRow.Cells[14].Value);
问题解决 关于窗体构造函数传空值如何解决?
原因是如果使用了.ToString()就必须保证前面的值不为空才能转换,如果为空就永远报错。


参考这样写:

DateTime _temp_time = DateTime.MinValue;
DateTime _TheTrueTime = DateTime.TryParse(_current_time.Trim(), out _temp_time) == true ? _temp_time : DateTime.MinValue;
if (_TheTrueTime.CompareTo(DateTime.MinValue) != 0)
{

}

其他的int.TryParse,double.Tryparse,也是类似的。
这样的写法。好处是永远都不会报错。

#5


xxx=this.dataGridView1.CurrentRow.Cells[2].Value?.ToString()??string.Empty;

#1


对传入的数据先进行非空验证,然后再进行下一步工作

#2


关于窗体构造函数传空值如何解决?问题是 实际情况确实需要传递空值,有值的时候传递值,无值的时候传递空值

#3


把 djb.备注 = this.dataGridView1.CurrentRow.Cells[15].Value.ToString();
改成djb.备注 = Convert.ToString(this.dataGridView1.CurrentRow.Cells[14].Value);
问题解决 关于窗体构造函数传空值如何解决?
原因是如果使用了.ToString()就必须保证前面的值不为空才能转换,如果为空就永远报错。

#4


引用 3 楼 wang_fuliang 的回复:
把 djb.备注 = this.dataGridView1.CurrentRow.Cells[15].Value.ToString();
改成djb.备注 = Convert.ToString(this.dataGridView1.CurrentRow.Cells[14].Value);
问题解决 关于窗体构造函数传空值如何解决?
原因是如果使用了.ToString()就必须保证前面的值不为空才能转换,如果为空就永远报错。


参考这样写:

DateTime _temp_time = DateTime.MinValue;
DateTime _TheTrueTime = DateTime.TryParse(_current_time.Trim(), out _temp_time) == true ? _temp_time : DateTime.MinValue;
if (_TheTrueTime.CompareTo(DateTime.MinValue) != 0)
{

}

其他的int.TryParse,double.Tryparse,也是类似的。
这样的写法。好处是永远都不会报错。

#5


xxx=this.dataGridView1.CurrentRow.Cells[2].Value?.ToString()??string.Empty;