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

C#使用其他表单更改datagridview字体大小时出现异常错误,c#,winforms,C#,Winforms,我有两个表单,一个包含datagridview,另一个包含用于更改datagridview字体大小的轨迹栏,如下所示: 我创建了以下代码以允许Form2访问Form1 datagridview: //This is for Form1, the one that contains the datagridview: public partial class Form1: Form { public Form1() { Form2 f = new Form2();

我有两个表单,一个包含datagridview,另一个包含用于更改datagridview字体大小的轨迹栏,如下所示:

我创建了以下代码以允许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";
    }
}
在构建过程中,我没有收到任何错误,但是当我尝试滑动轨迹栏时,我得到以下异常:

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

请尝试更换

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


这是因为您正在创建一个新的
表单2
,然后将其丢弃。换句话说,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
是什么(实际上默认情况下它的
null

您没有显示足够的代码(显示滑块窗体的方法丢失),但该代码可能应该设置滑块。也许是这样的:

private void btnShowSlider_Click(object sender, EventArgs e)
{
      using (var f = new Form2()) {
         f.dataGridFromForm1 = this.dataGridView1;
         f.ShowDialog(this);
      }
}
请注意,在上面,滑块窗体将是一个模式窗口,在关闭它之前,您将无法单击返回到它(这可能是一件好事)

除此之外,您还可以在
Form1
中有一个类实例变量,它跟踪
Form2
表单,根据需要显示/隐藏/处理它。另一种选择是将Form1的实例传递给Form2的构造函数,这样它就可以直接引用。可能是这样的:

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";
    }
}
并在Form1中创建它,如:

 Form2 f = new Form2(this);
 f.Show();
完成后,请确保处理/etc

还要注意,
TrackBar.Value
已经是一个
int
,因此您不需要将其转换为字符串并再次解析。这样的东西应该足够了:

new Font(..., trackBar1.Value)

似乎Form1中没有“Loaded”的定义所有表单的继承者都有此事件。在WinForms中,如果我没有弄错的话,它的名称类似于OnLoad。它是
Form.Load
。注意:尽管无论活动名称如何,这个答案都是不正确的,但请在发布答案之前进行研究。。。你的代码是
Loaded
,而你的评论是
OnLoad
,后面是“maybe”。在that.man中没有任何值,在wpf中,这个名为like Loaded的事件。我必须如何知道他的解决方案的类型?…问题被标记为
Winforms
,如果您注意到,在
Form1
的构造函数中,您创建了一个
Form2
对象,但它在构造函数的末尾超出了范围。我想稍后,为了显示表单,您将再次执行
form2f=newform2();f、 Show()f
没有实际设置的
dataGridFromForm1
属性,就是这样。当调用Form2时,我没有意识到我正在删除实例。我移动了实例化并修复了问题。感谢您的详细解释。很抱歉没有显示其余代码(在调用表单时显示)。你的假设是正确的。
new Font(..., trackBar1.Value)