我有两个表单,一个包含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。任何帮助将不胜感激。
答案 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;
};
}