2016-08-05 3 views
0

내 응용 프로그램에는 두 개의 창이 있습니다. 메인 윈도우에는 DataGridview과 버튼 (Add)이 각각 하나씩 있습니다. 버튼을 클릭하면 다른 창을 열고 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(); 
      } 

} 

문제는 때 가까운 번째 윈도하고 다시 Datagridview에 값을 추가 할 수있는 번째 윈도를 열고 메인 화면의 datagrid 값을 추가하는 대신보기가 교체되었습니다!

해결할 수있는 방법 (이 값을 창 하나를 닫까지 하나 하나를 업데이트)!

감사합니다.

+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

관련 문제