在另一个窗口中单击按钮更新DataGrid

时间:2017-10-22 11:20:49

标签: c# wpf

我有两个窗口:(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}}

2 个答案:

答案 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>。 这是两个窗口: Windows

这是我用来传递事件细节的自定义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)时,我引发事件,传入新名称输入。