[英]C# WPF MVVM - Merge multiple csv to datagrid
我一直在研究這個小程序,它需要獲取CSV文件的文件輸入,將它們存儲在列表框中,然后自動更新datagrid。 當添加更多文件時,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;
}
}
DataGridModel類
public class DataGridModel : INotifyPropertyChanged
{
DataTable _dataTableMerger { get; set; } = new DataTable();
public DataTable DatatableMerger
{
get
{
return _dataTableMerger;
}
set
{
_dataTableMerger = value;
OnPropertychanged("DatatableMerger");
}
}
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertychanged([CallerMemberName] string caller = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(caller));
}
}
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而不是Model保持一致。
如果運行MVVM,則在后面的“視圖”代碼中使用按鈕單擊事件是錯誤的。 它必須在ViewModel中完成。
除此之外,您的CSV解析器是錯誤的工具。 一旦字段包含分號,換行符,或者如果將komma用作字段分隔符而不是分號,則它將中斷。
閱讀更多有關等的內容。有關CSV文件的RFC規范,請在這里使用或使用可以正確解析文件的庫。 例如 ExcelDataReader ANd,如果您希望將其放入數據表; ExcelDataReader.DataSet
關於功能和正確綁定的示例,請參見以下說明:
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>
DataGridModel.cs
public class DataGridModel
{
public DataTable DatatableMerger { get; set; }
}
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));
}
}
委托命令
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);
}
}
並為合並功能。 使用YourMainTableName = Mergetables(Table1,table2)調用函數;
public DataTable MergeTables(DataTable Table1, DataTable Table2)
{
DataTable Mergetable = new DataTable();
foreach (DataColumn d in Table1.Columns)
{
Mergetable.Columns.Add(d.ColumnName);
}
foreach (DataColumn d in Table2.Columns)
{
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;
DataRow row2;
bool end = false;
int RowCount = 0;
while (!end)
{
end = true;
if (RowCount < Table1Rows || RowCount < Table2Rows)
{
end = false;
row2 = Mergetable.NewRow();
if (RowCount < Table1Rows)
{
for (int col = 0; col < Table1Cols; col++)
{
row2[col] = Table1.Rows[RowCount][col];
}
}
if (RowCount < Table2Rows)
{
for (int col = 0; col < Table2Cols; col++)
{
row2[col + Table1Cols] = Table2.Rows[RowCount][col];
}
}
Mergetable.Rows.Add(row2);
}
RowCount++;
}
return Mergetable;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.