C#WPF MVVM-将多个csv合并到datagrid
我一直在开发这个小程序,它需要获取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
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