2016-08-05 35 views
0

在我的應用程序中有兩個窗口。主窗口包含一個DataGridview和一個按鈕(添加)。當點擊按鈕時,它會打開另一個窗口,它包含2個文本框和按鈕。DataGridView沒有更新WPF中的按鈕點擊值

在窗口2上單擊按鈕時,文本框的值需要發送並顯示到主窗口DataGrid

這是2個文件!..

public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
     } 

     private void btn_Add_Click(object sender, RoutedEventArgs e) 
     { 
      Window1 win = new Window1(this); 
      win.Show(); 
     } 

    } 

window1.cs

 public Window1() 
      { 
       InitializeComponent();  
      } 
      private MainWindow m = null; 
      public Window1(Window callingFrom) 
      { 
       m = callingFrom as MainWindow; 
       InitializeComponent(); 
       DataTable dt = new DataTable(); 
       dt.Columns.Add("Name"); 
       dt.Columns.Add("ID"); 
       DataRow dr = dt.NewRow(); 
       m.dataGrid1.ItemsSource = dt.DefaultView; 
       m.dataGrid1.UpdateLayout(); 
      } 
     private void btn_Click(object sender, RoutedEventArgs e) 
      { 
       DataView dv = m.dataGrid1.ItemsSource as DataView; 

       DataTable dt = dv.Table; 
       DataRow dr = dt.NewRow(); 
       dr["Name"] = txt1.Text; 
       dr["ID"] = txt2.Text; 
       dt.Rows.Add(dr); 
       // this.Close(); 
       m.dataGrid1.UpdateLayout(); 
      } 

} 

問題是密切當WINDOW1和再次打開窗口1將值添加到Datagridview,主窗口的datagrid視圖被替換而不是添加值!

(這是更新值逐一高達關閉窗口1)

該如何解決!

謝謝!

+0

我看到你反覆詢問同一個問題而忽略了答案。 –

回答

0

您創建了一個新的DataTable,其中沒有任何東西。它是空的。然後你添加了一個項目,你替換舊的ItemsSource與新的DataTable,其中正好有一個新項目的意見。

當然舊的項目不再在網格中看到。你擺脫了很多麻煩。

想想這樣:你的鞋盒裏有一雙鞋。你把它丟在垃圾桶裏,垃圾人把它拿到垃圾堆裏,它已經消失了,你再也看不到它了。瞭解:如果鞋盒放在箱子裏時,你再也沒有鞋子了。他們隨箱子走了,因爲它們是裏面的這個箱子,箱子走了,所以鞋子也走了。

然後,第二天,你會得到一個新的盒子,並放入一雙新鞋。

新箱子裏有多少雙鞋子?準確地說,一雙鞋子,這雙鞋子是你剛放在箱子裏的新款,而不是那個在另一個箱子裏的舊鞋子。當你扔掉他們所在的盒子時,你把舊對扔進了垃圾箱。

有點像你上車開車去商店,當車到達商店時,你到達與它。因爲你在車內包含。這僅僅是一個比喻:我不是故意建議你本人實際上是丟棄的鞋子,或者是GridView中的一排。

下面是如何在一個不太錯誤的方式做到這一點:

public class GridItem 
{ 
    public GridItem(String i, String n) 
    { 
     ID = i; 
     Name = n; 
    } 

    public String ID { get; protected set; } 
    public String Name { get; protected set; } 
} 

public partial class MainWindow : Window 
{ 
    public ObservableCollection<GridItem> GridItems { get; private set; } 

    public MainWindow() 
    { 
     InitializeComponent(); 

     GridItems = new ObservableCollection<GridItem>(); 

     dataGrid1.ItemsSource = GridItems; 
    } 

    private void btn_Add_Click(object sender, RoutedEventArgs e) 
    { 
     Window1 win = new Window1(this); 
     win.Show(); 
    } 
} 

public class Window1 
{ 
    public Window1() 
    { 
     InitializeComponent();  
    } 

    private MainWindow m = null; 

    public Window1(Window callingFrom) 
    { 
     m = callingFrom as MainWindow; 

     InitializeComponent(); 
    } 

    private void btn_Click(object sender, RoutedEventArgs e) 
    { 
     // Because m.GridItems is an ObservableCollection, which has been assigned 
     // to the datagrid's ItemsSource property, the datagrid will magically 
     // update itself with the new item. When you add new items, the old items will 
     // still be seen because you are adding them to the same old collection 
     // instead of creating a new empty collection every time. 
     m.GridItems.Add(new GridItem(txt2.Text, txt1.Text)); 
    } 
} 

有點偏離主題,但你應該在某種程度上是有道理的事物命名。 txt2沒有任何意義。你應該把它稱爲txtID或者說它是什麼,所以任何查看代碼的人都可以立即理解它是什麼。 m也不是一個非常豐富的名字。

+0

非常感謝!它按我的預期工作。並感謝您的意見!我將在未來遵循這些事情! – zooha