2012-08-29 122 views
0

我有以下情況:一些數據完成的主窗口,它也是一個按鈕,打開一個新的模式窗口,您可以在其中選擇產品和產品範圍,然後單擊確定移動到下一個屏幕選擇數量,價格,並在批准數據後點擊確定,我想要訪問主窗口中模態窗口中選擇的數據,因爲它可以使用C#完成?C#和模態窗口

+0

whathaveyoutried.com – deltree

+0

通過參考傳遞您的參數。 – timmy

+2

@timmy如何...這與問題有什麼關係? –

回答

0

你可以做的東西,看起來或多或少是這樣的:

private void button1_Click(object sender, EventArgs e) 
{ 
    Form2 firstPopup = new Form2(); 
    firstPopup.ShowDialog(); 
    var someData = firstPopup.SomeValue; 

    Form2 secondPopup = new Form2(); 
    secondPopup.ShowDialog(); 
    var someOtherData = secondPopup.SomeValue; 

    doSomeStuff(someData, someOtherData); 
} 

在這種情況下SomeValue是一個公共的getter和setter方法私人窗體上的屬性。它的價值將在表單關閉之前設置。您可以爲每個表單以及任意數量的表單提供任意數量的此類屬性。

0

這與Open,Save As和Folder對話框的工作方式類似。就拿打開文件對話框,一旦你點擊OK,你可以訪問該選擇

建議的文件:

在你的模式窗口,設置其保存數據的一些公共屬性。設置你的OK按鈕,設置表格的DialogResult就OK了,在你的父窗體,你可以做下面的測試(在這種情況下,DataModel的是您要訪問數據)

if(modalWindow.DialogResult == DialogResult.OK) 
{ 
    this.DataModel = modalWindow.DataModel; 
} 

這裏是一個如何的一些信息使用的DialogResult http://msdn.microsoft.com/en-us/library/system.windows.forms.form.dialogresult.aspx

0

通常與您遵循類似的模式,以由打開文件對話框,在這裏做這樣的事情用一個模態窗口:

public class MyDialog : Form 
{ 
    public MyResult Result { get { /* code elided */ } } 
} 

也就是說,除了具有模態˚F orm的代碼 - 你還公開一個給定類型的公共Result屬性,它可以提供在表單的UI上輸入的數據(這比暴露表單上的控件更好,因爲它意味着你可以自由地更改所有這些,而不必重新 - 編碼依賴於它的任何其他形式)。

您確保該Result保證和有效如果單擊OkYes(無論確認按鈕)按鈕可用。然後你確定你相應地設置了DialogResult(你也可以給每個按鈕分配一個 - 例如DialogResult.Cancel給一個取消按鈕)。

然後當你打開你的表格你做這樣的事情:

var form1 = new MyDialog(); 

if(form1.ShowDialog() != DialogResult.OK) 
    return; //abort the operation, the user cancelled/closed the first modal 

MyResult form1Data = form1.Result; //get your actual data from that modal form. 
//...and then on with your second modal 

所以,如果你的模式(S)收集的數據,你走,如果中止任何被取消。

0

不要使用模態窗口!

如果你打電話

var dialog = new DialogWindow(); 
If (dialog.ShowDialog(mainWindow) == DialogResult.OK) { 
    use the result of the dialog window 
} 

對話窗口會模式,這意味着,你不能訪問其他窗口,同時它是開放的。

使用以下代碼,可以同時訪問這兩個窗口。但是,問題在於,在對話框運行時,主窗口中的代碼未暫停。

var dialog = new DialogWindow(); 
dialog.Show(mainWindow); 
You cannot use the result of the dialog window here! 

因此,您需要一種方法將對話框的完成與主窗口進行通信。我建議創建在對話窗口的事件爲此

public class ProductResultEventArgs : EventArgs 
{ 
    public ProductResultEventArgs(List<Product> products) 
    { 
     Products = products; 
    } 

    public List<Product> Products { get; private set; } 
} 

在對話窗口中

public event EventHandler<ProductResultEventArgs> ProductsChosen; 

private void OnProductsChosen(List<Product> products) 
{ 
    var eh = ProductsChosen; 
    if (eh != null) { 
     eh(this, new ProductResultEventArgs(products)); 
    } 
} 

private BtnOk_Click(object sender, EventArgs e) 
{ 
    OnProductsChosen(somehow get the product list); 
} 

在主窗口中,你可以做這樣的事情

var dialog = new DialogWindow(); 
dialog.ProcuctsChosen += Dialog_ProductsChosen 
dialog.Show(mainWindow); 

,並創建一個處理者

private Dialog_ProductsChosen(object sender, ProductResultEventArgs e) 
{ 
    use e.Products here 
} 

注意:將主窗口作爲參數傳遞到ShowDialogShow將使該對話框的主窗口所有者。這意味着對話窗口將始終停留在主窗口的前面,並且不會在其後面消失。如果你最小化主窗口,這也會最小化對話窗口。

+0

但是,它是讓它自動將主窗口中的控件與來自Silverlight應用程序中模態窗口的數據相加的方法嗎?我問,因爲我不久使用C# –

+0

你的問題很不清楚。大多數在這裏回答的人都假設問題是關於將數據從對話窗口傳遞到主窗口以及模態窗口的可訪問性。現在你正在問完全不同的東西(添加一個控件),並首次提到Silverlight。您應該爲您的問題添加一個Silverlight標籤,因爲這需要完全不同於WinForms的解決方案。 –