2016-08-05 71 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