Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#WPF MVVM-将多个csv合并到datagrid_C#_Wpf_Csv_Mvvm_Datagrid - Fatal编程技术网

C#WPF MVVM-将多个csv合并到datagrid

C#WPF MVVM-将多个csv合并到datagrid,c#,wpf,csv,mvvm,datagrid,C#,Wpf,Csv,Mvvm,Datagrid,我一直在开发这个小程序,它需要获取CSV文件的文件输入,将它们存储在列表框中,然后自动更新数据网格。当添加了更多文件时,datagrid需要使用新的文件数据展开并在其旁边添加 有效的方法是使用XAML代码和codebehind中的绑定将文件添加到列表框中 不起作用的是合并数据以动态显示,并绑定到datagrid。属性已更改,但网格未更新 在DataGridViewModel中,我的csv合并代码是: public class DataGridViewModel { static

我一直在开发这个小程序,它需要获取CSV文件的文件输入,将它们存储在列表框中,然后自动更新数据网格。当添加了更多文件时,datagrid需要使用新的文件数据展开并在其旁边添加

  • 有效的方法是使用XAML代码和codebehind中的绑定将文件添加到列表框中
  • 不起作用的是合并数据以动态显示,并绑定到datagrid。属性已更改,但网格未更新
  • 在DataGridViewModel中,我的csv合并代码是:

    public class DataGridViewModel 
        {
       static public DataGridModel _dataGridModel = new DataGridModel();
    
        public static void ReturnDataTableForGridView()
        {
            DataTable mainTable = new DataTable();
            //-- #3 Test merge 
            foreach (var item in SidePanelViewModel.GetPathFileList())
            {
                DataTable dataTable = new DataTable();
                try
                {
    
                    string[] Lines = File.ReadAllLines(item.Filepath);
                    string[] Fields;
                    Fields = Lines[0].Split(new char[] { ';' });
                    int Cols = Fields.GetLength(0);
    
                    //1st row skal være kolonne navn; 
                    for (int X = 0; X < Cols; X++)
                        dataTable.Columns.Add(Fields[X].ToLower(), typeof(string));
    
                    DataRow Row;
                    for (int T = 1; T < Lines.GetLength(0); T++)
                    {
                        Fields = Lines[T].Split(new char[] { ';' });
                        Row = dataTable.NewRow();
                        for (int f = 0; f < Cols; f++)
                            Row[f] = Fields[f];
                        dataTable.Rows.Add(Row);
                    }
                    //-- Merges every files(tables) into one.
                    mainTable.Merge(dataTable);                   
                }
                catch (Exception)
                {
                    return null;
                }
            }
            //-- Sets the datatablemerger which raises the propertychanged 
            _dataGridModel.DatatableMerger = mainTable;
    
        }
    }
    
    dataGridview类

        public DataGridView()
        {
            InitializeComponent();
        }
    
    XAML代码:

            <DataGrid x:Name="MainDataGrid"  Grid.Row="1" VerticalAlignment="Stretch" Height="auto" ItemsSource="{Binding Path=DatatableMerger, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, NotifyOnSourceUpdated=True}" >
        </DataGrid>
    </Grid>
    <UserControl.DataContext>
         <Model:DataGridModel/>
    </UserControl.DataContext>
    
    
    
    当前输出:

    希望的产出:


    我的朋友举了个例子帮助我

    以下是ansvar:

    XAML中的DataContext是错误的。视图必须与ViewModel而不是模型通信

    如果您运行MVVM,那么在视图代码隐藏中使用按钮单击事件是错误的。必须在ViewModel中执行此操作

    除此之外,您的CSV解析器是错误的实现集。一旦字段包含semikolon、新行,或者如果将komma用作字段分隔符而不是semikolon,则该字段将立即中断

    阅读有关CSV文件的更多信息,或使用能够正确解析文件的库。如果你想把它放到你的数据表中

    关于功能和正确绑定的示例,请参见以下示例:

    MainWindow.cs

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
    }
    
    XAML

        <Window.DataContext>
        <local:DataGridViewModel/>
    </Window.DataContext>
    <Grid>
        <DataGrid Margin="0,0,0,35" ItemsSource="{Binding DatatableMerger}"/>
        <Button Content="Add rows" Margin="0,0,10,10" Command="{Binding AddRowsButtonClickCommand}" Height="20" VerticalAlignment="Bottom" HorizontalAlignment="Right" Width="75"/>
    </Grid>
    
    DataGridViewModel.cs

        public class DataGridViewModel : INotifyPropertyChanged
    {
        private readonly DataGridModel _dataGridModel = new DataGridModel();
    
        public DataTable DatatableMerger => _dataGridModel.DatatableMerger;
    
        public ICommand AddRowsButtonClickCommand => new DelegateCommand(o => ReturnDataTableForGridView());
    
        public event PropertyChangedEventHandler PropertyChanged;
    
        private void OnPropertyChanged(string propertyName) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    
        public void ReturnDataTableForGridView()
        {
            var dt = new DataTable();
    
            dt.Columns.Add("Foo");
            dt.Columns.Add("Bar");
            dt.Columns.Add("Baz");
    
            for (var i = 0; i < 5; i++)
                dt.Rows.Add($"Value {i}", i, DateTime.Now.AddSeconds(i));
    
            _dataGridModel.DatatableMerger = dt;
            OnPropertyChanged(nameof(DatatableMerger));
        }
    }
    
    公共类DataGridViewModel:INotifyPropertyChanged
    {
    私有只读DataGridModel_DataGridModel=新DataGridModel();
    公共DataTable DataTableMerge=>\u dataGridModel.DataTableMerge;
    公共ICommand AddRowsButtonClickCommand=>new DelegateCommand(o=>ReturnDataTableForGridView());
    公共事件属性更改事件处理程序属性更改;
    私有void OnPropertyChanged(字符串propertyName)=>PropertyChanged?.Invoke(这是新的PropertyChangedEventArgs(propertyName));
    public void ReturnDataTableForGridView()
    {
    var dt=新数据表();
    dt.列。添加(“Foo”);
    dt.列。添加(“条”);
    dt.列。添加(“Baz”);
    对于(变量i=0;i<5;i++)
    Add($“Value{i}”,i,DateTime.Now.AddSeconds(i));
    _dataGridModel.DataTableMerge=dt;
    OnPropertyChanged(名称(DataTableMerge));
    }
    }
    
    代理命令

        public class DelegateCommand : ICommand
    {
        private readonly Predicate<object> _canExecute;
        private readonly Action<object> _execute;
    
        public event EventHandler CanExecuteChanged;
    
        public DelegateCommand(Action<object> execute) : this(execute, null) { }
    
        public DelegateCommand(Action<object> execute, Predicate<object> canExecute)
        {
            _execute = execute;
            _canExecute = canExecute;
        }
    
        public bool CanExecute(object parameter)
        {
            if (_canExecute is null)
                return true;
    
            return _canExecute(parameter);
        }
    
        public void Execute(object parameter)
        {
            _execute(parameter);
        }
    
        public void RaiseCanExecuteChanged()
        {
            CanExecuteChanged?.Invoke(this, EventArgs.Empty);
        }
    }
    
    公共类DelegateCommand:ICommand
    {
    私有只读谓词_canExecute;
    私有只读操作\u执行;
    公共事件处理程序CanExecuteChanged;
    公共DelegateCommand(Action execute):这个(execute,null){}
    公共DelegateCommand(操作执行,谓词canExecute)
    {
    _执行=执行;
    _canExecute=canExecute;
    }
    公共布尔CanExecute(对象参数)
    {
    如果(_canExecute为空)
    返回true;
    返回_canExecute(参数);
    }
    public void Execute(对象参数)
    {
    _执行(参数);
    }
    public void raisecancecutechanged()
    {
    CanExecuteChanged?.Invoke(此为EventArgs.Empty);
    }
    }
    
    以及合并功能。使用maintablename=Mergetables(表1、表2)调用函数

    公共数据表合并表(数据表表1、数据表2)
    {
    DataTable Mergetable=新DataTable();
    foreach(表1.Columns中的数据列d)
    {
    Mergetable.Columns.Add(d.ColumnName);
    }
    foreach(表2.Columns中的数据列d)
    {
    Mergetable.Columns.Add(d.ColumnName);
    }
    int Table1Cols=Table1.Columns.Count;
    int Table1Rows=Table1.Rows.Count;
    int Table2Cols=Table2.Columns.Count;
    int Table2Rows=Table2.Rows.Count;
    数据行第2行;
    bool end=false;
    int RowCount=0;
    当(!结束)
    {
    结束=真;
    如果(行数<表1行| |行数<表2行)
    {
    结束=假;
    row2=Mergetable.NewRow();
    如果(行数<表1行)
    {
    for(int col=0;col
    我的朋友帮我举了个例子

    以下是ansvar:

    XAML中的DataContext是错误的。视图必须与ViewModel而不是模型通信

    如果您运行MVVM,那么在视图代码隐藏中使用按钮单击事件是错误的。必须在ViewModel中执行此操作

    除此之外,您的CSV解析器是错误的实现集。一旦字段包含semikolon、新行,或者如果将komma用作字段分隔符而不是semikolon,则该字段将立即中断

    阅读有关CSV文件的更多信息,或使用能够正确解析文件的库。如果你想把它放到你的数据表中

    关于功能和正确绑定的示例,请参见以下示例:

    MainWindow.cs

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
    }
    
    XAML

        <Window.DataContext>
        <local:DataGridViewModel/>
    </Window.DataContext>
    <Grid>
        <DataGrid Margin="0,0,0,35" ItemsSource="{Binding DatatableMerger}"/>
        <Button Content="Add rows" Margin="0,0,10,10" Command="{Binding AddRowsButtonClickCommand}" Height="20" VerticalAlignment="Bottom" HorizontalAlignment="Right" Width="75"/>
    </Grid>
    
    DataGridViewModel.cs

        public class DataGridViewModel : INotifyPropertyChanged
    {
        private readonly DataGridModel _dataGridModel = new DataGridModel();
    
        public DataTable DatatableMerger => _dataGridModel.DatatableMerger;
    
        public ICommand AddRowsButtonClickCommand => new DelegateCommand(o => ReturnDataTableForGridView());
    
        public event PropertyChangedEventHandler PropertyChanged;
    
        private void OnPropertyChanged(string propertyName) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    
        public void ReturnDataTableForGridView()
        {
            var dt = new DataTable();
    
            dt.Columns.Add("Foo");
            dt.Columns.Add("Bar");
            dt.Columns.Add("Baz");
    
            for (var i = 0; i < 5; i++)
                dt.Rows.Add($"Value {i}", i, DateTime.Now.AddSeconds(i));
    
            _dataGridModel.DatatableMerger = dt;
            OnPropertyChanged(nameof(DatatableMerger));
        }
    }
    
    公共类DataGridViewModel:INotifyPropertyChanged
    {
    私有只读DataGridModel_DataGridModel=新DataGridModel();
    公共DataTable DataTableMerge=>\u dataGridModel.DataTableMerge;
    公共ICommand AddRowsButtonClickCommand=>new DelegateCommand(o=>ReturnDataTab