我有一个带有网格(名为SimOrder_grd)的WPF窗口,该网格内置于我的MainWindow中,其中填充了MainWindow_Loaded事件中的按钮,如下所示:
public partial class MainWindow: Window
{
List<DirectiveObjects> SimOrders = new List<DirectiveObjects>();
SqlConnection admin_connect = ... (removed for post)
public MainWindow()
{
InitializeComponenent();
Loaded += MainWindow_Loaded;
}
private void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
admin_connect.Open();
string sim_sqlString = "SELECT * FROM dbo.SimOrder;";
//get all sim orders from database
using (SqlCommand so_cmd = new SqlCommand(sim_sqlString,admin_connect))
{
SqlDataReader so_rd = so_cmd.ExecuteReader();
while (so_rd.Read())
{
SimOrders.Add(new DirectiveObjects
{
id= Convert.ToInt16(so_rd["Id"]),
title = so_rd["Title"].ToString(),
});
}
}
admin_connect.Close();
int topmargin = 0; int rownum = 0;
foreach(DirectiveObjects dir in SimOrders)
{
//generate button
Button dir_btn = new Button();
dir_btn.Content = dir.title; dir_btn.Width = SimOrder_grd.Width;
dir_bt.Height = 20;
dir_btn.Margin = new Thickness(0, topmargin, 0,0);
dir_btn.Name = dir.title + "_btn";
dir_btn.Click += dir_btn_Click;
SimOrder_grd.Children.Add(dir_btn); topmargin += 25; rownum++;
}
}
这一切都按预期工作,我在网格中得到一个很好的按钮,我可以点击; dir_btn_click事件工作正常。但是,我创建了一个按钮,用户可以在其中添加自己的&#34; SimOrder&#34;到网格菜单。它被称为AddSimO,按钮点击在下面工作:
private void AddSimO_btn_Click(object sender, RoutedEventArgs e)
{
string DBName = "dbo.SimOrder"; string GridName = "SimOrder_grd";
var CreateNewDialog = new FrAdministration.SimAdd(DBName, GridName);
CreateNewDialog.Show();
}
这将打开一个新窗口,用户可以在该窗口中键入一个新的标题,然后将其保存到数据库中。 来自SimAdd.xaml.cs;
public partial class SimAdd: Window
{
public SimAdd(string db, string grid)
{
InitializeComponent();
}
private void Cancel_btn_Click(object sender, RoutedEventArgs e)
{
this.Close(); //cancel button closes the window.
}
private void saveSim_btn_Click(object sender, RoutedEventArgs e)
{
if (String.IsNullOrEmpty(SimName_txt.Text){MessageBox.Show("Please enter a title");}
else
{
SqlConnection Si_connect = new ...(removed again)
Si_connect.Open();
string add_sqlString = "INSERT INTO dbo.SimOrder (Title) VALUES (@title);";
using (SqlCommand add_cmd = new SqlCommand(add_sqlString, SimConnect))
{
add_cmd.Parameters.Add("@title", SqlDbType.NvarChar).Value = SimName_txt.Text;
add_cmd.ExecuteNonQuery();
}
Si_connect.Close();
this.Close();
MainWindow mwindow = new FrAdministration.MainWindow();
mwindow.Sim_update();
}
}
}
这和我可以看到我的数据库更新一样有效。下一篇文章是我的问题所在。
如何使用我在数据库中创建的新条目的新按钮更新网格。这是我尝试过的:
1。)我试图在SimAdd窗口中调用的Sim_update方法中重新创建我的按钮列表。
public void Sim_update()
{
admin_connect.Open();
SimOrder_grd.Children.Clear(); SimOrders.Clear();
this.UpdateLayout();//saw this on Stack Overflow and thought I'd try.
string sim_sqlString = "SELECT * FROM dbo.SimOrder;";
//get all sim orders from database
using (SqlCommand so_cmd = new SqlCommand(sim_sqlString,admin_connect))
{
SqlDataReader so_rd = so_cmd.ExecuteReader();
while (so_rd.Read())
{
SimOrders.Add(new DirectiveObjects
{
id= Convert.ToInt16(so_rd["Id"]),
title = so_rd["Title"].ToString(),
});
}
}
admin_connect.Close();
int topmargin = 0; int rownum = 0;
foreach(DirectiveObjects dir in SimOrders)
{
//generate button
Button dir_btn = new Button();
dir_btn.Content = dir.title; dir_btn.Width = SimOrder_grd.Width;
dir_bt.Height = 20;
dir_btn.Margin = new Thickness(0, topmargin, 0,0);
dir_btn.Name = dir.title + "_btn";
dir_btn.Click += dir_btn_Click;
SimOrder_grd.Children.Add(dir_btn); topmargin += 25; rownum++;
}
}
我知道这与MainWindow_Loaded事件中的信息相同,但这不起作用。
2.)我尝试添加this.UpdateLayout();在我的foreach循环之后和我的网格清除之后,这个.InvalidateVisual(),但这似乎没有帮助。我也试过SimOrder_grd.UpdateLayout();和SimOrder_grd.InvalidateVisual();.
3.)我创建了一个按钮来刷新名为Refresh的页面。当我手动点击按钮时,这可以刷新我的网格。
private void Refresh_Click(object sender, RoutedEventArgs e)
{
admin_connect.Open();
SimOrder_grd.Children.Clear(); SimOrders.Clear();
this.UpdateLayout();
string sim_sqlString = "SELECT * FROM dbo.SimOrder;";
//get all sim orders from database
using (SqlCommand so_cmd = new SqlCommand(sim_sqlString,admin_connect))
{
SqlDataReader so_rd = so_cmd.ExecuteReader();
while (so_rd.Read())
{
SimOrders.Add(new DirectiveObjects
{
id= Convert.ToInt16(so_rd["Id"]),
title = so_rd["Title"].ToString(),
});
}
}
admin_connect.Close();
int topmargin = 0; int rownum = 0;
foreach(DirectiveObjects dir in SimOrders)
{
//generate button
Button dir_btn = new Button();
dir_btn.Content = dir.title; dir_btn.Width = SimOrder_grd.Width;
dir_bt.Height = 20;
dir_btn.Margin = new Thickness(0, topmargin, 0,0);
dir_btn.Name = dir.title + "_btn";
dir_btn.Click += dir_btn_Click;
SimOrder_grd.Children.Add(dir_btn); topmargin += 25; rownum++;
}
}
我不希望用户必须单击另一个按钮才能看到他们的更改,因此我尝试按以下方式自动化按钮(所有内容都来自第4个代码报价块的Sim_update)。
4)。 ButtonAutomationPeer peer = new ButtonAutomationPeer(Refresh); IInvokeProvider invoker = peer.GetPattern(PatternInterface.Invoke)as IInvokeProvider; invoker.Invoke();
5)。 Refresh.RaiseEvent(new RoutedEventArgs(Button.ClickEvent));
6)。 Refresh.Click(此,NULL);
这两个都将运行Refresh_Click事件,但不会像手动按下“刷新”按钮那样更新网格。
最后我在Sim_update()中尝试了以下内容: 7.)
this.Dispatcher.BeginInvoke(new Action() => this.SimOrder_grd.UpdateLayout()), null);
和8.) Action EmptyDelegate = delegate(){}; SimOrder_grd.Dispatcher.Invoke(DispatcherPriority.Render,EmptyDelegate);
我完全没有想法,我真的很想知道为什么我尝试的一切都不起作用。
是因为我是在没有激活主窗口的情况下来自第二个窗口并运行方法吗?
是因为ButtonAutomationPeer不像手动点击按钮那样更新UI吗?
谢谢大家,