这段时间在试着做海康sdk的二次开发,现在有两个form(mainform,addform),mainform上有个treeview控件,此控件放在groupbox控件里。现在我要通过点击addform上的button,完成对mainform上treeview的操作。
我通过mainform中button点击事件来显示addform:
addform frm = new addform(this);//将mainform传递给addform
frm.ShowDialog();
在addform重载构造函数:
public addform(mainform mainfrm)
{ mainf = mainfrm; }//mainf已定义
然后在addform里的button点击事件中:
treeview tv_dvr = (treeview) mainf.controls["tv_dvr"];
tv_dvr.nodes[0].nodes.add("test");
现在问题出在 (treeview) mainf.controls["tv_dvr"]获取不到mainform上的name为"tv_dvr"的treeview,这个mainf已经获取到了,就是mainform,是不是因为这个treeview在groupbox里,所以要写成:
treeview tv_dvr = (treeview) mainf.controls["groupbox_tv"].controls["tv_dvr"];//groupbox_tv为存放treeview控件的groupbox的name
这样才能获取到?
望各位大侠赐教!谢谢!
------解决思路----------------------
不知道你窗体的布局 谁会知道 你的控件在那里
假设 你 Form1 里面有一个 pannel 而 里面放着一个button
你以为 那个 button 是在 Form1.Controls["button1"] 里面?
其实 他是在 Form1.Controls["pannel1"].Controls["button1"]...
------解决思路----------------------
这么麻烦,
你直接把 mainform的 treeview控件设置为 public 就可以啦。
------解决思路----------------------
this.容器.controls["xxx"]
------解决思路----------------------
首先你的猜测是正确的,只能从它的每层父级依次检索,这个顺序没有捷径。
但检索的效率是非常低的,每次你调用这个TreeView都要这样检索并转换的话,是非常不负责任的。
通常可以用这几种方法进行优化:
1.将这个TreeView设置为public,从而使它可以在别的类中直接访问
2.可以继续使用检索,但这个检索最好由mainform自己来做,且检索完成后就记住它,避免这样的开销重复发生
------解决思路----------------------
private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
//获取右键点击
if (e.Button == MouseButtons.Right)
{
e.Node.BeginEdit();
}
}
private void treeView1_AfterLabelEdit(object sender, NodeLabelEditEventArgs e)
{
//这里写你想更新到数据库的内容和相关的方法
//发回数据到数据库
}
这样不行么。 直接编辑。 都不用弹窗。