关闭Form2后刷新Form1

时间:2017-10-26 23:07:57

标签: c# wpf visual-studio

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

这就是我创建datagrid的方式(在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并查看更新的数据网格?

提前致谢!

4 个答案:

答案 0 :(得分: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。

答案 1 :(得分:0)

假设您的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

答案 2 :(得分:0)

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

只需在表单1的代码中添加处理程序,当窗口被激活(即重新聚焦)时,将刷新DataGrid。

public class Form1 : Window {

    public Form1() {
        InitializeComponent();  
    }

    private void RefreshDataGrid() {
        // Refresh DataGrid Here
    }

    private void Form1_Activated(object sender, EventArgs e) {
        RefreshDataGrid();
    }
}

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

实现此目的的另一种方法是在调用表单1时将表单1的引用传递给表单2并从表单2触发表单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();
    }
}

对任何错误道歉。代码是徒手写的。

答案 3 :(得分:0)

在你的胜利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();
}

切换到赢取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()将负责刷新数据网格