我有两个窗口:(1)Add
和(2)DataGrid
我想要做的是每当我点击Home
页面上的Submit
按钮时更新Add
上的DataGrid
。
CSV File
中加载的数据是MVVM
。我希望在不使用Add
的情况下实现这一目标,如果可能的话。
到目前为止,我所使用的代码只能在第一次运行时运行。例如,我填写Submit
中的字段,然后第一次点击DataGrid
按钮。 Submit
会更新,但是当我第二次尝试(不关闭应用程序)时,它将不再按我想要的那样做。我该如何解决这个问题?
Add
中的 public void btn_Submit_Click(object sender, RoutedEventArgs e)
{
save();
string edata = @"Employees.txt";
Home h = new Home();
h.grid.ItemsSource = edata.ToList();
btn_clear_Click(sender, e);
error_mssg.Text = "** SUCCESS! **";
}
按钮点击事件
Home
<StackPanel Margin="0 10 0 0">
<DataGrid x:Name="grid" Height="400" ItemsSource="{Binding}"/>
</StackPanel>
页面xaml
Home
public void Populate()
{
DataTable table = LoadDataGrid.display(@"EmployeeData.txt");
grid.DataContext = table;
}
页面cs
LoadDataGrid
public static DataTable display(string path)
{
DataTable dt = new DataTable();
using (StreamReader sr = new StreamReader(path))
{
string[] headers = sr.ReadLine().Split(',');
foreach (string header in headers)
{
dt.Columns.Add(header);
}
while (!sr.EndOfStream)
{
string[] rows = sr.ReadLine().Split(',');
DataRow dr = dt.NewRow();
for (int i = 0; i < headers.Length; i++)
{
dr[i] = rows[i];
}
dt.Rows.Add(dr);
}
}
return dt;
}
cs
h.grid.Items.Refresh();
我还添加了用于在需要的情况下使用csv文件的内容填充DataGrid的代码。
我也尝试过做
h.grid.ItemsSource = edata.ToList();
而不是
{{1}}
答案 0 :(得分:0)
我是这样做的:
public class Home {
private AddPage ap;
public void createAddPage() {
ap = new AddPage();
ap.setHome(this);
}
public DataGrid getDataGrid() {
return your_datagrid;
}
}
public class AddPage {
private Home home;
public void setHome(Home home) {
this.home = home;
}
public void button_click(/*some params*/) {
DataGrid dg = home.getDataGrid();
//do stuff with dg...
}
}
答案 1 :(得分:0)
我创建了一个简单的解决方案,我认为可以解决您的问题。我将其简化为“Home”窗口显示名称列表的情况。在第二个窗口中,用户可以键入新名称,然后将其添加到第一个窗口中显示的名称列表中。
做法:
解决方案是将事件添加到第二个窗口。当“Home”窗口创建第二个窗口的实例时,主窗口订阅第二个窗口的事件。当第二个窗口触发事件时,第二个窗口传递要添加到第一个窗口上显示的列表的新名称。
因此,添加到列表是在“主页”窗口中完成的。
注意:显示的项目列表实际上是ObservableCollection<string>
。
这是两个窗口:
这是我用来传递事件细节的自定义EventArgs对象,在这种情况下,是刚刚在第二个窗口中添加的新名称:
public class NameAddedEventArgs:EventArgs
{
public string NewName { get; set; }
}
这是我的“主页”窗口中的代码。该窗口名为“MainWindow”:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext = new ObservableCollection<string>();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
var window1 = new Window1();
window1.ItemAddedEvent += ItemAddedEventHandler;
window1.Show();
}
private void ItemAddedEventHandler(object sender, NameAddedEventArgs e)
{
(DataContext as ObservableCollection<string>).Add(e.NewName);
}
}
所以你可以看到,当我创建“Window1”,这是第二个窗口时,我订阅了它的事件。 这是Window1中的代码:
public partial class Window1 : Window
{
public event EventHandler<NameAddedEventArgs> ItemAddedEvent;
public Window1()
{
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
RaiseNewNameEvent(txtInput.Text);
}
protected void RaiseNewNameEvent(string newName)
{
var nameAddedEventArgs = new NameAddedEventArgs { NewName=newName };
var handler = ItemAddedEvent;
if (handler != null)
{
handler(this, nameAddedEventArgs);
}
}
}
这里,当单击按钮添加名称(名称输入到txtInput)时,我引发事件,传入新名称输入。