2011-02-15 17 views
0

如何從類庫中的方法中填充表單?所以在下面的例子中,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 
     } 
} 

UPDATE: 更具體地,所述MyLib中庫包含通過List<string[]>一個類,將.csv文件加載到一個數組(其中的每一行會被添加到一個List<string[]>)和比將循環尋找「可能」的重複。無論何時發現用戶需要在兩個記錄上呈現(在表單上)以最終確定它們是否相同。

+0

如果類庫MyLib中應該是通用的後端,所以相關的非UI,它竟然一無所知UI元素或消息框和用戶交互,我想你應該驗證邏輯移動到UI,並傳遞給該圖書館只驗證/良好的輸入。 – 2011-02-15 08:58:31

+0

@Davide Piras酒店 - 恕我直言,圖書館應該處理驗證過,因爲驗證通常是通過比較數據,其他數據,其用戶界面不具備執行,除非你的意思是「不正確的日期格式」之類的驗證。 UI應該處理解析等,即語法驗證,但是邏輯的語義驗證應該由數據庫來處理。 – 2011-02-15 09:16:03

+0

驗證庫中的輸入/輸出和驗證用戶輸入是有區別的。 UI /模型層應該真正關心用戶輸入驗證,因爲只有它知道「商業」規則。 – 2011-02-15 09:18:35

回答

1

如何從類庫中的方法中填充表單?

真正的問題是爲什麼你想要?圖書館不應該爲這樣的事情負責。這是針對您的工作流和用戶界面的邏輯,而不是通常使用的庫。該庫應該提供有用的數據結構,但是應用程序特定的東西(如收集輸入和決定如何處理)應由代碼處理。

無論如何......我覺得有點骯髒說這個......你總是可以傳遞一個對你的表單類型的引用作爲該方法的一個參數(一種方法,除其他外,將緊密地耦合兩個程序集,使一個不可用沒有其他)...

不寒而慄

0

您可以使用十字/循環引用,但這是不可取由於以下幾個原因。

您也可以在類庫中聲明一個Form類型的對象(如果是靜態的話更好),並將該表單作爲引用傳遞,並且您可以通過成員「Controls」在該被引用變量中調用子控件錯誤。

0

儘管Ed在最後發表評論,但不要做!當然這是可能的,但這沒有意義。抵制誘惑!

該庫應該實現一些通用功能,即提供數據結構,邏輯方法或P/Invoke方法。但是在你的表單中,類是你的用戶界面邏輯的地方。只需在Form1中創建一個方法來處理驗證。這會更容易,更清晰。

0

這是一個很大的問題。

最簡單的方法是在您的類庫中添加對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 
     } 
    } 
} 

希望能幫到

相關問題