C#使用其他表单更改datagridview字体大小时出现异常错误
我有两个表单,一个包含datagridview,另一个包含用于更改datagridview字体大小的轨迹栏,如下所示: 我创建了以下代码以允许Form2访问Form1 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();
//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)