我的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。这里究竟出了什么问题?
答案 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);
这应该做你想做的事情,虽然这是一个非常丑陋的方式。