DataGridView不会更新WPF中按钮单击的值

时间:2016-08-05 11:58:01

标签: c# wpf datagridview wpfdatagrid

在我的应用程序中有两个窗口。主窗口包含一个DataGridview和一个按钮(添加)。单击按钮时,它会打开另一个窗口,它包含2个文本框和按钮。

在窗口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并再次打开window1以将值添加到Datagridview时,主窗口的datagrid视图被替换而不是添加值!

(关闭窗口1逐个更新值)

如何解决这个问题!

谢谢!

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也不是一个非常有用的名字。