如何从没有参数的函数引用调用表单

时间:2017-09-22 13:35:07

标签: c# vb.net dll

我有两个项目。一个是GUI,第二个是DLL。

我在Form1的DLL中调用函数

DLL函数必须连接表单(Say,Change Back Color)

我想将Calling表单作为参考,而不作为参数传递。

以下是表格1的示例

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        ChangeBackColor()
End Sub

DLL函数

Public Sub ChangeBackColor()
  Dim CallingForm as Form
  '''GET PARENT HERE'''
  CallingForm.BackColor = Color.Cyan
End Sub

显然,如果我每次都通过Form,我可以这样做,但试图避免这种情况。 提前谢谢

有人注意到这个问题已在其他地方得到解答。就我所见,它尚未被回答(或被问及)。这特定于引用表单,而不是方法或其他对象。

我已经通过引用Form.ActiveForm获得了引用调用表单的解决方案。现在我正在回答我自己的问题。

2 个答案:

答案 0 :(得分:1)

从设计的角度来看,这真的是一件坏事。

以这种方式设计应用程序存在许多严重问题:

  • 您依赖于环境上下文之类的内容,如果使用不当,则会出现反模式。这是一个典型的错误使用案例,因为:
  • 您隐藏ChangeBackColor函数依赖于调用方法的表单的事实!!如果其他代码块调用此代码怎么办?代码将失败!!

最后一点特别是一个问题,因为这使得单元测试这段代码非常困难并且容易出错。方法签名都是关于传达函数的意图,因此还需要告诉它需要执行工作的事物(对象,值,服务等)。

因此,如果函数中需要表单或任何对象,请在签名中显示!!

如果你不想在每次通话中都需要添加它,你可以通过将其创建为扩展方法来美化代码:

Public Module FormExtensions
   <Extension>
   Public Sub ChangeBackColor(form as Form, newBackColor as Color)
        form.Backcolor = newBackColor
   End Sub
End Module

你在表单实例中这样称呼:

Me.ChangeBackColor(Color.Red)

答案 1 :(得分:0)

我最后通过使用来调用活动表单

Form.ActiveForm

以下功能现在(以及其他功能)

Public Sub ChangeBackColor()
  Dim CallingForm as Form
  '''GET PARENT HERE'''
  CallingForm = Form.ActiveForm
  CallingForm.BackColor = Color.Cyan
End Sub

感谢所有尝试过帮助的人