从另一个类调用Window_Loaded事件
本文关键字:Loaded 事件 Window 调用 另一个 | 更新日期: 2023-09-27 18:24:32
My MainWindow.xaml.cs类包括以下Window_Loaded
事件:
public void Window_Loaded(object sender, RoutedEventArgs e)
{
SQLClass sqlclass = new SQLClass();
sqlclass.initSQL(dataGrid1);
}
因此,我从SQLClass
调用这个initSql(Datagrid dataGrid)
方法,它实际上将我的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时,我会从BluetoothLE
类调用Window_Loaded
方法:
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。这里到底出了什么问题?。
您正在创建一个不显示的主窗口的新实例,而不是更新当前MainWindow
的datagrid
。尝试:
private void Update()
{
//enter datagrid functionality you have in window load event
}
public class BluetoothLE
{
private void dispatcherTimer_Tick(object sender, EventArgs e)
{
dispatcherTimer.Stop();
Update();
}
}
代码:
MainWindow mainwin = new MainWindow();
mainwin.Window_Loaded(this, null);
将不起作用,您需要在MainWindow
的当前实例上调用Window_Loaded
,创建新实例(使用new MainWindow()
行)不会影响屏幕上显示的窗口。
我不知道你在哪里创建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);
}
}
如果您从MainWindow
:内部的创建BluetoothLE
var bluetooth = new BluetoothLE(this);
如果你想摆脱这种依赖(从长远来看,你可能应该这样做),你可能想使用C#事件,但那是另一回事。
另外,将更新代码提取到一个名为UpdateGrid()
或其他的单独方法中,并从Window_Load
事件和其他需要更新的地方调用它,Window_Load
不应该用于从其他地方更新UI。
((MainWindow)Application.Current.MainWindow).Window_Loaded(this, null);
这应该做你想做的事情,尽管这是一种非常丑陋的方式