2016-08-05 2 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 и снова открыть Window1 добавить значения 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