我有两个程序,都在不同的名称空间中,彼此独立运行。如果通过单击另一个表单上的按钮执行按钮,我想在一个表单上调用按钮的单击事件。
我能够在VB中通过制作表单public
,在表单2中引用 dll 并从namespace.form1.button_click
调用点击来完成此操作但无法正常工作如何在C#中做到这一点。
答案 0 :(得分:0)
首先将form2承包商的访问修饰符更改为private,将button_click方法更改为public。
然后将此代码添加到Form2类:
private static Form2 _Instance;
public static Form2 Instance
{
get
{
if (_Instance == null)
_Instance = new Form2();
return _Instance;
}
}
现在你可以从form1中的button_click中调用form2中的buuton_click,如下所示:
private void button1_Click(object sender, EventArgs e)
{
Form2.Instance.button1_Click(this, EventArgs.Empty);
}
答案 1 :(得分:0)
您需要将form2对象的引用(通过单击按钮在ArcGIS应用程序中启动它)传递给form1对象。
如果form2是一个单独的加载项(由第三方提供)并且不公开任何API函数,那么我认为很难实现你想要的。如果您已创建此加载项,则可以公开一个函数,以便其他应用程序可以调用此加载项上的按钮单击。
此外,两个加载项之间的通信模式还取决于加载项在ArcGIS应用程序中的加载方式(进程内或进程外)。根据这个,你可以直接调用另一个函数,或者你可能需要通过远程处理,RPC等等。
以上回复基于我对如何调用另一个加载项的按钮单击的理解,可能与此特定情况无关。请提供有关环境的更多详细信息,创建加载项的人员等
编辑:在OP的评论后添加以下内容
由于您拥有两个项目的代码并且可以更新它们,这很好,我们可以做任何我们想做的事情
在将form2对象的引用传递给form1之后,form1将只能访问System.Windows.Forms.Form的所有方法(即使你在form2中使button_click为public,也无法访问)
创建一个新项目,它将作为基础(prjBase)并包含一个接口IOutsideCallable
interface IOutsideCallable {
void PerformButtonClick();
}
现在,在form1和form2的项目中添加对上述项目的引用 在form2
中实现上述接口class Form2: System.Windows.Forms.Form, IOutsideCallable {
// other form code
public void PerformButtonClick() {
btn_Click(null, null);
}
}
在form1中,创建一个变量以指向IOutsideCallable类型的对象。您可以在form1的构造函数中或通过属性传递form2对象。 (正如您在评论中提到的,您不知道构造函数的传递顺序,您可以使用该属性)
所以,在form1
class Form1: System.Windows.Forms.Form {
// form1 code
public IOutsideCallable Form2Variable { get; set; }
void foo() { // the function in which you will invoke the button click of Form2
if(Form2Variable != null) Form2Variable.PerformButtonClick();
}
}