从另一个类调用Window_Loaded事件

时间:2014-09-25 12:46:06

标签: c# sql wpf datagrid

我的MainWindow.xaml.cs类包含以下Window_Loaded事件:

public void Window_Loaded(object sender, RoutedEventArgs e)
{
    SQLClass sqlclass = new SQLClass();
    sqlclass.initSQL(dataGrid1);
}

所以我从initSql(Datagrid dataGrid)调用这个SQLClass方法,它实际上将我的dataGrid绑定到Sql表。

public void initSQL(DataGrid dataGrid)
{
    AppDomain.CurrentDomain.SetData("DataDirectory", "C:\\Users\\Osman\\");
    try
    {
        using (SqlConnection cn = new SqlConnection("Data Source=.\\SQLExpress;Initial Catalog=FinalApplication1;Integrated Security=True;"))
        {

            cn.Open();
            SqlDataAdapter adap = new SqlDataAdapter("SELECT Time, Condition FROM Status", cn);
            System.Data.DataSet ds = new System.Data.DataSet();
            adap.Fill(ds, "Status");
            dataGrid.DataContext = ds.Tables["Status"].DefaultView;
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show("Error\n" + ex.Message, "Error", MessageBoxButton.OK, MessageBoxImage.Error);
    }
}

这在启动时非常有效,但是当我想在将值插入Sql表后更新dataGrid时,我就从我的Window_Loaded类调用BluetoothLE方法:< / p>

public class BluetoothLE
{
    private void dispatcherTimer_Tick(object sender, EventArgs e)
    {
        dispatcherTimer.Stop();
        MainWindow mainwin = new MainWindow();
        mainwin.Window_Loaded(this, null);
    }
}

问题是在这种情况下dataGrid不会更新。触发Window_Loaded方法,但不更新dataGrid。这里究竟出了什么问题?

3 个答案:

答案 0 :(得分:1)

您正在创建主窗口的新实例,而不是更新当前datagrid的{​​{1}}。尝试:

MainWindow

答案 1 :(得分:1)

代码:

MainWindow mainwin = new MainWindow();
mainwin.Window_Loaded(this, null);

无法使用,您需要在Window_Loaded的当前实例上调用MainWindow,创建新实例(使用new MainWindow()行)不会影响& #39; s显示在屏幕上。

我不知道您在哪里创建BluetoothLE类,但它需要引用MainWindow实例,以便它可以调用它上面的方法。如下所示:

public class BluetoothLE
{
    private MainWindow windowInstance;
    public BluetoothLE(MainWindow windowInstance) {
        this.windowInstance = windowInstance;
    }
    private void dispatcherTimer_Tick(object sender, EventArgs e)
    {
        dispatcherTimer.Stop();
        windowInstance.Window_Loaded(this, null);
    }
}

如果您从内创建BluetoothLE MainWindow

var bluetooth = new BluetoothLE(this);

如果你想摆脱这种依赖(你可能从长远来看),你可能想要使用C#事件,但这是另一个故事。

同时将更新代码提取到名为UpdateGrid()的单独方法中,并从Window_Load事件和您需要更新的其他位置调用它,Window_Load不应该用于从其他地方更新UI。

答案 2 :(得分:0)

((MainWindow)Application.Current.MainWindow).Window_Loaded(this, null);

这应该做你想做的事情,虽然这是一个非常丑陋的方式。