如何从类库中的方法中填充表单?因此,在下面的示例中,Method1()就是它的内容。
Project "UI", Windows Forms Application
reference to MyLib
public class Form1 : Form
{
...
call some methods from MyLib.MyClass
...
}
Project "MyLib", Class Library
public class MyClass
{
...
public void Method1()
{
loop through an array and ask user to validate some data on the form during each iteration
}
}
更新:
更具体地说,MyLib库包含一个类,它将.csv文件加载到一个数组中(每行将被添加到List<string[]>
),然后循环遍历List<string[]>
寻找“可能的”重复。每当找到一个用户时,需要在(在表格上)显示两个记录以最终确定它们是否相同。
答案 0 :(得分:1)
如何从类库中的方法中填充表单?
真正的问题是你为什么要这样做?图书馆不应对此类事负责。这是特定于您的工作流和UI的逻辑,而不是通常用于库的东西。该库应该提供有用的数据结构,但应该由您的代码处理特定于您的应用程序的内容(如收集输入和决定如何处理它)。
无论如何......我觉得这有点脏......你总是可以将对表单类型的引用作为方法的参数传递(一种方法,除其他外,将两个程序集紧密耦合,让一个人无法使用另一个)...
颤动
答案 1 :(得分:0)
您可以使用交叉/循环引用,但由于多种原因,这是不可取的。
你也可以在类库中声明一个Form类型的对象(如果是静态的话更好),并将该表单作为引用传递,如果我没有弄错的话你可以通过成员“Controls”调用该引用变量中的子控件
答案 2 :(得分:0)
即使Ed把最后的评论放进去,也不要做!当然这是可能的,但没有任何意义。抵制诱惑!
库应该实现一些通用功能,即提供数据结构,逻辑方法或P / Invoke方法。但是在您的表单中,类是UI的逻辑所在。只需在Form1中创建一个方法来处理验证。这将更容易,也更清晰。
答案 3 :(得分:0)
这是一个很大的问题。
最简单的方法是在类lib中添加对System.Windows.Forms的引用。然后,将窗口作为参数传递给您的业务类。 但是,尽管这个解决方案很简单,但它并不是一种干净的方式。在干净的分层体系结构中,您不能在较低层中使用上层对象。这既是编译的挑战,也是维护黑洞的挑战。此外,单元测试这类案件很复杂。
考虑到这一点,另一个更复杂的解决方案是使用Unity,Mef或其他任何框架使用控制反转,甚至手动执行。
主要思想是在类库中创建一个定义用户交互的接口,如下所示:
public interface IInputValidator {
bool IsValid(MyClass itemToValidate);
}
然后,在您的Windows窗体应用程序中,实现此接口:
public class Form1 : Form, IInputValidator {
public void CallBusinessClass() {
var myObj = new BusinessClass(this); // the key of the concept is here
myObj.Iterate();
}
public bool IsValid(MyClass itemToValidate) {
return MessageBox.Show("Is valid ?", MessageBoxButtons.YesNo) == MessageBoxButtons.Yes);
}
}
然后,在您的商务舱中:
public class BusinessClass {
private IInputValidator m_validator;
public BusinessClass(IInputValidator validator) {
this.m_validator = validator;
}
public void Iterate()
{
foreach(var item in ItemsToIterate)
{
var isValid = m_validator.IsValid(item); // call the upper layer from a lower layer
}
}
}
希望有所帮助