【问题标题】:Datagrid add items to datatable from another windowDatagrid 从另一个窗口将项目添加到数据表
【发布时间】:2014-03-13 14:15:45
【问题描述】:

我的程序在这里遇到了一个小问题。我正在尝试将项目添加到我的数据表中,然后让它显示在我的数据网格上。我可以使用主页中的简单代码来完成此操作,但我想要一个外部页面将结果发送给我,但我无法找出我在这里做错了什么。

主窗口

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Data;

namespace Træner_Program
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        Display();
    }

     public DataTable dt = new DataTable(); 
    public DataTable dtBind = new DataTable(); 

    public void Display() 
    { 
        //I create the data in memory 
        //usually the date is get from DataBase and cached in memory to enhance the performance 
        dt = new DataTable();
        dt.Columns.Add("Øvelse");
        dt.Columns.Add("Vægt");
        dt.Columns.Add("Sæt");
        dt.Columns.Add("Gentagelser");
        dt.Columns.Add("Pause");
        dtBind = dt.Copy();
        Binding bind = new Binding();
        bind.Source = dtBind;
        this.dtgPlan.SetBinding(ListView.ItemsSourceProperty, bind); 
    } 

    public void AddRow(string Øvelse, string Vægt, string Sæt, string Gentagelser, string Pause)         
    { 
        DataRow dr = dt.NewRow(); 
        dr["Øvelse"] = Øvelse; 
        dr["Vægt"] = Vægt; 
        dr["Sæt"] = Sæt;
        dr["Gentagelser"] = Gentagelser;
        dr["Pause"] = Pause; 
        dt.Rows.Add(dr);
        dtBind = dt.Copy();
        Binding bind = new Binding();
        bind.Source = dtBind;
        this.dtgPlan.SetBinding(ListView.ItemsSourceProperty, bind); 

    } 

    private void btnGem_Click(object sender, RoutedEventArgs e)
    {
        //this is the working command from mainpage
        //AddRow("Bænkpres", "80", "3", "10", "50");
    }

    private void btnTilføj_Click(object sender, RoutedEventArgs e)
    {
        var tilføjØvelse = new Tilføj_Øvelse();
        tilføjØvelse.Show();



    }
}
}

添加项目

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;

namespace Træner_Program
{
/// <summary>
/// Interaction logic for Tilføj_Øvelse.xaml
/// </summary>
public partial class Tilføj_Øvelse : Window
{
    MainWindow mw = new MainWindow();

    public Tilføj_Øvelse()
    {
        InitializeComponent();
    }

    private void btnTilføj_Click(object sender, RoutedEventArgs e)
    {
        mw.AddRow("Bænkpres", "80", "3", "10", "50");
        Close();
    }

    private void btnAnuller_Click(object sender, RoutedEventArgs e)
    {
        Close();
    }
}
}

【问题讨论】:

    标签: c# wpf datagrid datatable


    【解决方案1】:

    这是因为您正在创建一个新的 MainWindow,而不是使用调用子窗口的初始窗口。

    一个简单的解决方法是将 Parent MainWindow 的引用传递给 Child,如下所示:

    更新孩子:

    public partial class Tilføj_Øvelse : Window
    {
        MainWindow mw;
    
        public Tilføj_Øvelse(MainWindow mainWindow)
        {
            InitializeComponent();
            mw = mainWindow;
        }
    
        private void btnTilføj_Click(object sender, RoutedEventArgs e)
        {
            mw.AddRow("Bænkpres", "80", "3", "10", "50");
            Close();
        }
    
        private void btnAnuller_Click(object sender, RoutedEventArgs e)
        {
            Close();
        }
    }
    

    然后更新对它的调用:

      private void btnTilføj_Click(object sender, RoutedEventArgs e)
        {
            var tilføjØvelse = new Tilføj_Øvelse(this);
            tilføjØvelse.Show();
        }
    

    不过,最好的(也是推荐的)方法是使用 MVVM 模式并为这两个 Windows 创建一个共享的 ViewModel。

    【讨论】:

    • 尝试修复我当前的代码,但没有成功。相反,我对这些所做的每一次更改都会出错。但我正在查找您建议的 MVVM 模式,看看那是什么,但对于快速回复来说很重要
    • 好的尝试再次使用第一个解决方案进行修复,这是给出的错误消息错误 1 ​​无法将类型“System.Windows.Window”隐式转换为“Træner_Program.MainWindow”。存在显式转换(您是否缺少演员表?) C:\Users\HansHenrik\documents\visual studio 2012\Projects\Træner Program\Træner Program\Tilføj Øvelse.xaml.cs 27 18 Træner Program
    • @user3415760 立即尝试.. 修复了参数。输入
    • 不客气!不过,按照建议,一旦您对 WPF 更加熟悉,您可能想要开始研究 MVVM。您通常不希望在“代码隐藏”中使用这种类型的代码
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-27
    • 1970-01-01
    • 2016-09-23
    • 2017-02-18
    • 1970-01-01
    相关资源
    最近更新 更多