2012-04-10 8 views
0

データベースからデータを取得するためにWcfを使用するインターフェイスで作業しています。次の問題があります。情報を表示するために動的ウィンドウを使用しています。など...新しいウィンドウが複製されます

しかし、私がウィンドウを閉じて再び開くと、すでにそこにあったフォームにすべてのものが追加されます。ダブルを作成していくつかの問題を引き起こしています。アドバイスは事前にありがとうございます。

ここで

より良い私が持っているものを説明するためにいくつかのコードです....

これは私が私の主なフォーム、WHIに持っているボタンですchは新しいウィンドウを作成します

private void butMoreInf_Click(object sender, RoutedEventArgs e) 
{ 
    winMain.DataContext = null; 
    winMainContainer.DataContext = null; 
    winMainContainerLeft.DataContext = null; 
    winMainContainerRight.DataContext = null; 
    datGrid.DataContext = null; 

    //Generate the new window and panel to go within the window 
    winMain.Height = 750; 
    winMain.Width = 950; 
    winMainContainer.Width = 1000; 
    winMainContainer.HorizontalAlignment = HorizontalAlignment.Left; 
    winMainContainerLeft.Width = 120; 
    winMainContainerLeft.HorizontalAlignment = HorizontalAlignment.Left; 
    winMainContainerRight.Width = 880; 
    winMainContainerRight.HorizontalAlignment = HorizontalAlignment.Left; 

    //Generate the datagrid to contain the date to be changed etc. 
    datGrid.Margin = new Thickness(0, 12, 12, 12); 
    datGrid.HorizontalAlignment = HorizontalAlignment.Right; 

    //Generate a datepicker (start) and label 
    Label labS = new Label(); 
    labS.Content = "Pick a start date"; 
    labS.Width = 100; 
    labS.Margin = new Thickness(12, 1, 0, 1); 
    labS.HorizontalAlignment = HorizontalAlignment.Left; 

    DatePicker datPickStart = new DatePicker(); 
    datPickStart.Width = 100; 
    datPickStart.Margin = new Thickness(12, 12, 1, 0); 
    datPickStart.HorizontalAlignment = HorizontalAlignment.Left; 
    datPickStart.SelectedDate = DateTime.Now.AddDays(-7); 
    datStartPick = datPickStart.SelectedDate == null ? DateTime.Now : Convert.ToDateTime(datPickStart.SelectedDate); 

    //Generate a datepicker (end) and label 
    Label labE = new Label(); 
    labE.Content = "Pick an end date"; 
    labE.Width = 100; 
    labE.Margin = new Thickness(12, 1, 0, 1); 
    labE.HorizontalAlignment = HorizontalAlignment.Left; 

    DatePicker datPickEnd = new DatePicker(); 
    datPickEnd.Width = 100; 
    datPickEnd.Margin = new Thickness(12, 12, 1, 0); 
    datPickEnd.HorizontalAlignment = HorizontalAlignment.Left; 
    datPickEnd.SelectedDate = DateTime.Now; 
    datEndPick = datPickEnd.SelectedDate == null ? DateTime.Now : Convert.ToDateTime(datPickEnd.SelectedDate); 

    //Generate dropdown and label for that box 
    Label labY = new Label(); 
    labY.Content = ""; 
    labY.Width = 100; 
    labY.Margin = new Thickness(12, 1, 0, 1); 
    labY.HorizontalAlignment = HorizontalAlignment.Left; 

    ComboBox txtY = new ComboBox(); 
    txtY.Width = 100; 
    txtY.Margin = new Thickness(12, 12, 1, 0); 
    txtY.HorizontalAlignment = HorizontalAlignment.Left; 
    txtY.SelectedIndex = 0; 
    txtY.SelectionChanged += CLLoadErrors; 

    txtY.SelectedIndex = 0; 

    //Generate error list button 
    Button butError = new Button(); 
    butError.Width = 100; 
    butError.Margin = new Thickness(12, 12, 1, 0); 
    butError.HorizontalAlignment = HorizontalAlignment.Left; 
    butError.Content = "Get Errors"; 
    butError.Click += CLLoadErrors; 

    //Generate clear button 
    Button butClear = new Button(); 
    butClear.Width = 100; 
    butClear.Margin = new Thickness(12, 12, 1, 0); 
    butClear.HorizontalAlignment = HorizontalAlignment.Left; 
    butClear.Content = "Clear Grid"; 
    butClear.Click += clearDataGrid; 

    //Generate close button 
    Button butClose = new Button(); 
    butClose.Width = 100; 
    butClose.Margin = new Thickness(12, 12, 1, 0); 
    butClose.HorizontalAlignment = HorizontalAlignment.Left; 
    butClose.Content = "Close"; 
    butClose.Click += CLHide; 

    //Add elements to the stackpanel/Also updates them before each instance 
    winMainContainerLeft.UpdateLayout(); 

    winMainContainerLeft.Children.Add(labS); 
    winMainContainerLeft.Children.Add(datPickStart); 
    winMainContainerLeft.Children.Add(labE); 
    winMainContainerLeft.Children.Add(datPickEnd); 
    winMainContainerLeft.Children.Add(labY); 
    winMainContainerLeft.Children.Add(txtY); 
    winMainContainerLeft.Children.Add(butError); 
    winMainContainerLeft.Children.Add(butClear); 
    winMainContainerLeft.Children.Add(butClose); 

    winMainContainerRight.UpdateLayout(); 
    winMainContainerRight.Children.Remove(datGrid); 
    winMainContainerRight.Children.Add(datGrid); 

    winMainContainer.UpdateLayout(); 
    winMainContainer.Orientation = Orientation.Horizontal; 
    winMainContainer.Children.Remove(winMainContainerLeft); 
    winMainContainer.Children.Add(winMainContainerLeft); 
    winMainContainer.Children.Remove(winMainContainerRight); 
    winMainContainer.Children.Add(winMainContainerRight); 

    winMain.ResizeMode = ResizeMode.NoResize; 

    //Display the new form 
    winMain.UpdateLayout(); 
    winMain.Content = winMainContainer; 
    winMain.Show(); 

    datGrid.MouseDoubleClick += datGridDClick; 
    txtY.SelectionChanged += new SelectionChangedEventHandler(txtY_SelectionChanged); 
} 

必要に応じてさらにコードを提供します。

答えて

1

新しい要素を追加する前に、同じウィンドウを何度も何度も再利用しています(なぜですか?)ので、新しい要素を追加する前に子コレクションをクリアする必要があります。ダブル/トリプル/ ...コントロールで。

更新:StackPanels(あなたのコメント/ Childrenの列挙を持つ)を使用すると仮定します。 Children列挙はUIElementCollectionで、Clearメソッドを呼び出すことができます。新しいコントロールを追加する前にこれを呼び出してください。 (winMainContainerwinMainContainerRightおよびwinMainContainerLeft

+0

私はdatacontextsを否定したのです。子供の要素を削除して再構築しようとしましたが、同じ問題があるようです。 –

+0

datacontextを 'null'に設定しても、コントロールのコレクション自体に影響はありません。 'ComboBox xy = new ComboBox();)を呼び出すことによって子要素を削除することはできません。 ...; winMainContainerLeft.Children.Remove(xy); 'それは別のreferene値を持つためです。 – Matten

+0

@Taeerilは私の答えを更新しました – Matten

0

winMainはどこで初期化しますか?それは静的変数ですか、あるいは現在のフォーム内に存在しますか?

私は、既存のオブジェクトにコントロールを追加し続けていることを推測しています(重複の影響があります)。この問題を解決するには、

winMain = new WinMainForm(); 

フォームオブジェクトを再初期化する可能性がいずれか、またはあなたが作成されていないように見えます新しい子供たち

foreach(var c in winMainContainer.children){ 
    winMainContainer.children.remove(c) 
} 
+0

ありがとう、私は答えを得ました –

0

を追加する前に、WinMain関数の変数右上のすべてのコントロールを削除することができ新しいウィンドウではなく、いくつかの上位スコープに存在する 'winMain'上で操作を実行するだけです。したがって、関数を呼び出すたびにスタックパネルに子どもを追加するだけです。

メソッドの最初にこのようなことを行うことで、問題を解決できます。これは本当にとにかく意味がありません(

winMainContainer.Children.Remove(winMainContainerLeft); 
winMainContainer.Children.Add(winMainContainerLeft); 
winMainContainer.Children.Remove(winMainContainerRight); 
winMainContainer.Children.Add(winMainContainerRight); 

しかし、あなたがそれらを追加する前にそれらを削除する必要はありません。

winMainContainerLeft.Clear(); 
winMainContainerRight.Clear(); 
winMainContainer.Children.Clear(); 

私はまた、あなたの例では、次の行が含まれていることに気づきました。 )

+0

C#は私のトランプカード、 ありがとうございました –

関連する問題