如何在循环期间要求用户从另一个类输入(通过Form)?

时间:2011-02-15 08:51:37

标签: c# visual-studio

如何从类库中的方法中填充表单?因此,在下面的示例中,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[]>寻找“可能的”重复。每当找到一个用户时,需要在(在表格上)显示两个记录以最终确定它们是否相同。

4 个答案:

答案 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
        }
    }
}

希望有所帮助