使用其他表单更改datagridview字体大小时出现C#异常错误

时间:2016-11-16 17:31:42

标签: c# winforms

我有两个表单,一个包含datagridview,另一个包含一个轨道栏来更改datagridview的字体大小,如下所示: enter image description here

我创建了以下代码以允许Form2访问Form1 datagridview:

//This is for Form1, the one that contains the datagridview:
public partial class Form1: Form
{
    public Form1()
    {
        Form2 f = new Form2();
        f.dataGridFromForm1 = dataGridView1;
    }

//This is for Form2, the one that contains the trackbar:
public partial class Form2: Form
{
    public DataGridView dataGridFromForm1 { get; set;}
    private void trackBar1_Scroll(object sender, EventArgs e)
    {
        dataGridFromForm1.RowsDefaultCellStyle.Font =
        new Font(dataGridFromForm1.RowsDefaultCellStyle.Font.FontFamily, 
        float.Parse(trackBar1.Value.ToString()));
        label1.Text = trackBar1.Value.ToString() + "pt";
    }
}

在构建期间我没有遇到任何错误,但是当我尝试滑动轨迹栏时,我得到以下异常: enter image description here

我不确定我在这里错过了什么,因为我认为我已经实例化了datagridview。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:3)

这是因为您正在创建新的Form2,然后将其丢弃。换句话说,Form1的构造函数执行此操作:

public Form1()
{
    Form2 f = new Form2();   // creates a new Form2
    f.dataGridFromForm1 = dataGridView1; // sets the property
    // f is now out of scope
}

您的f是构造函数中的局部变量。当您稍后显示表单时(可能是通过再次调用Form2 f = new Form2();,然后再调用f.Show()不知道dataGridFromForm1是什么(事实上它是{{ 1}}默认情况下)。

您没有显示足够的代码(缺少显示滑块形式的方法),但 代码应该设置滑块。也许是这样的事情:

null

请注意,在上面,滑块形式将是一个模态窗口,在你关闭之前你将无法点击它(这可能是一件好事)

除此之外,你可以在private void btnShowSlider_Click(object sender, EventArgs e) { using (var f = new Form2()) { f.dataGridFromForm1 = this.dataGridView1; f.ShowDialog(this); } } 内有一个类实例变量,它可以跟踪你的Form1表单,显示/隐藏/处理它。另一种选择是将Form1的实例传递给Form2的构造函数,因此它直接有一个引用。 可以看起来像这样:

Form2

并在Form1中创建它,如:

public partial class Form2 : Form {
    private Form1 _form1;
    public Form2(Form1 otherForm) {
          _form1 = otherForm;
    } 
    private void trackBar1_Scroll(object sender, EventArgs e)
    {
        _form1.dataGridFromForm1.RowsDefaultCellStyle.Font =
        new Font(form1.dataGridFromForm1.RowsDefaultCellStyle.Font.FontFamily, 
        trackBar1.Value);
        label1.Text = trackBar1.Value + "pt";
    }
}

确保在完成后处理/ etc。

另请注意, Form2 f = new Form2(this); f.Show(); TrackBar.Value,因此您无需将其转换为字符串并再次解析。这样的事情就足够了:

int

答案 1 :(得分:-1)

尝试替换

public Form1()
{
    Form2 f = new Form2();
    f.dataGridFromForm1 = dataGridView1;
}

public Form1()
{
    this.Load += (s,e) => 
        {
            Form2 f = new Form2();
            f.dataGridFromForm1 = dataGridView1;
        };
}