【问题标题】:Refresh Form1 after closing Form2关闭 Form2 后刷新 Form1
【发布时间】:2017-10-26 23:07:57
【问题描述】:

在 Form2 中更新数据库后,我想刷新 Form1 中的数据网格。我的问题是在我关闭 Form2 后它没有更新 Form1 中的数据网格。从字面上看,我不知道该怎么做。有人可以帮帮我吗?

这就是我创建数据网格的方式(在 Form1 中):

LagerDBEntities1 dataEntities = new LagerDBEntities1();          
var query =
   from product in dataEntities.Artikel
   select new { product.Id, product.artikelname, product.bestand };            
   dataGrid1.ItemsSource = query.ToList();

这就是我切换到 Form2 的方式:

Window2 Auslagern = new Window2(currbestand, artikelid, artikelname);
this.Close();
Auslagern.Show();

这就是我切换到 Form1 的方式:

MainWindow Main = new MainWindow();
this.Close();
Main.Show();

在 Form2 中我正在更新数据库:

int counter = currentbestand - ValueS;
if (counter > 0)
    {
            SqlConnection con = new SqlConnection(@"X");
            try
            {

                con.Open();
                string Query = "update Artikel set bestand='" + counter + "' where id='" + artikelid + "' ";
                SqlCommand createCommand = new SqlCommand(Query, con);
                createCommand.ExecuteNonQuery();                    
                con.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

            MainWindow Main = new MainWindow();
            this.Close();
            Main.Show();


        }

那么如何切换回 Form1 并查看更新后的数据网格?

提前致谢!

【问题讨论】:

  • 我会调查RelayCommands 并在您的ViewModels 和datagrid 集合上实施INotifyPropertyChanged
  • 您没有在表单之间切换 - 您每次都在创建新表单。您是想简单地切换还是在您当前的行为之后?
  • 我只是想在Forms之间切换然后更新Form1中的datagrid

标签: c# wpf visual-studio


【解决方案1】:

好的 - 问题解决了!

这不能正常工作:

LagerDBEntities1 dataEntities = new LagerDBEntities1();          
var query =
   from product in dataEntities.Artikel
   select new { product.Id, product.artikelname, product.bestand };            
   dataGrid1.ItemsSource = query.ToList();

所以我用这个替换它并且它起作用了:

        SqlConnection con = new SqlConnection(@"Data Source=X");
        SqlDataAdapter Query = new SqlDataAdapter(@"SELECT Id, artikelname, bestand FROM Artikel", con);
        DataTable dt = new DataTable();

        Query.Fill(dt);

        dataGrid1.ItemsSource = null;
        dataGrid1.ItemsSource = dt.DefaultView;

感谢 Binuriki Cliean Jay。

【讨论】:

    【解决方案2】:

    假设您的 Form2 将其信息添加到数据库中,您可以将填充 Datagrid 的代码放入公共方法中,然后在每次加载表单时调用它,因为看起来您在关闭后创建了 Form1 的新实例表格2。

    public void LoadDatagrid()
    {
        LagerDBEntities1 dataEntities = new LagerDBEntities1();          
        var query =
               from product in dataEntities.Artikel
               select new { product.Id, product.artikelname, product.bestand };            
               dataGrid1.ItemsSource = query.ToList();
    }
    

    然后在Form1的Show事件中调用LoadDatagrid

    【讨论】:

    • 它没有用。它仍然显示更新前的旧数据网格。
    • Form2 中发生了什么?是否将信息添加到加载 Datagrid 的数据库中?请提供更多代码以帮助我们理解问题。
    • 我只是在更新数据库。可以看到上面的代码
    【解决方案3】:

    一种解决方案是对表格 1 使用 Window.Activated() 事件

    只需在 Form 1 的代码中添加处理程序,当窗口被激活(即重新获得焦点)时,DataGrid 就会刷新。

    public class Form1 : Window {
    
        public Form1() {
            InitializeComponent();  
        }
    
        private void RefreshDataGrid() {
            // Refresh DataGrid Here
        }
    
        private void Form1_Activated(object sender, EventArgs e) {
            RefreshDataGrid();
        }
    }
    

    唯一的问题是每次激活窗口时都会触发该事件。

    实现此目的的另一种方法是在调用时将对 Form 1 的引用传递给 Form 2,并从 Form 2 触发 Form 1 中的公共事件

    public class Form1 : Window {
    
        public Form1() {
            InitializeComponent();
            Form2 f2 = new Form2(this);
        }
    
        public void RefreshDataGrid() {
            // Refresh DataGrid Here
        }
    }
    
    public class Form2 : Window {
    
        private Form1 Form1Ref;
    
        public Form2(Form1 f1) {
            Form1Ref = f1;
        }
    
        void Form2_Closing(object sender, CancelEventArgs e) {
            if (Form1Ref != null) Form1Ref.RefreshDataGrid();
        }
    }
    

    对任何错误表示歉意。代码是徒手编写的。

    【讨论】:

      【解决方案4】:

      在你的胜利 1 中:

      public MainWindow()
      {
          InitializeComponent();
          LoadDatagrid();
      }
      
      public void LoadDatagrid()
      {
          LagerDBEntities1 dataEntities = new LagerDBEntities1();          
          var query =
                 from product in dataEntities.Artikel
                 select new { product.Id, product.artikelname, product.bestand };            
                 dataGrid1.ItemsSource = query.ToList();
      }
      

      在切换到 win 2 时更改您的代码:

      Window2 Auslagern = new Window2(currbestand, artikelid, artikelname);
      Auslagern.Show();
      this.Close();
      

      那么当你从win 2切换回win1时:

      MainWindow Main = new MainWindow();
      Main.Show();
      this.Close();
      

      public MainWindow() 将负责刷新数据网格

      【讨论】:

      • 它没有用。它没有刷新 Datagrid,MainWindow() 正在处理 LoadDatagrid,但它没有刷新它。
      • 有点奇怪。我很确定“var query = from product in dataEntities.Artikel ...”应该从表中检索最新条目。然后会去datagridview.itemsource
      • 在你的win 1中,尝试添加一个按钮,然后双击它进入点击事件。然后把这个:LoadDatagrid();然后运行它,更新win form 2中的行。然后检查你的数据库表是否真的插入或更新了新行。如果数据库没有得到更新,那么问题是你的插入/更新。如果没有,则返回主窗体。然后按下按钮。如果数据库没有刷新,那么尝试在 LoadDataGrid 中放置一个断点,看看你的查询会发生什么。查询可能有误
      • 插入/更新工作正常,但我必须关闭当前程序并重新启动它。当我这样做时,它会向我显示更新的数据网格,否则不会..
      • 我现在用按钮试了一下,但没有用,我还检查了我的数据库,行已更新
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-03
      • 1970-01-01
      相关资源
      最近更新 更多