C# MahApps DataGrid无法获取用户输入并写入csv
任何帮助都将不胜感激。对不起,如果我的代码是junior。我是C的新手 问题 我已经使用MahApps在弹出框中动态创建了多个数据网格。数据网格由CSV文件ConvertCSVTodatable填充。我希望用户能够对DataGrids进行更改,当更改完成后,DataGrids值将替换CSV filesUpdateDataGrid参数 UI树:弹出按钮>堆栈面板>组框>数据网格 发行 DG.SelectAllCells不会从用户更改的数据网格中进行选择。如何获取DataGid的可视化UI表示,或者如何将DT属性绑定到数据更改事件。我希望我的解释是正确的。如果你有任何问题,可以帮助我,请张贴,我会迅速回应。谢谢C# MahApps DataGrid无法获取用户输入并写入csv,c#,wpf,csv,datagrid,mahapps.metro,C#,Wpf,Csv,Datagrid,Mahapps.metro,任何帮助都将不胜感激。对不起,如果我的代码是junior。我是C的新手 问题 我已经使用MahApps在弹出框中动态创建了多个数据网格。数据网格由CSV文件ConvertCSVTodatable填充。我希望用户能够对DataGrids进行更改,当更改完成后,DataGrids值将替换CSV filesUpdateDataGrid参数 UI树:弹出按钮>堆栈面板>组框>数据网格 发行 DG.SelectAllCells不会从用户更改的数据网格中进行选择。如何获取DataGid的可视化UI表示,或者
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.IO;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
namespace SpiderRoll.Classes
{
public class DataGridProperties
{
private int IDValue;
public int ID
{
get { return IDValue; }
set { IDValue = value; }
}
private string HeaderValue;
public string Header
{
get { return HeaderValue; }
set { HeaderValue = value; }
}
private string DescriptionValue;
public string Description
{
get { return DescriptionValue; }
set { DescriptionValue = value; }
}
private string NameValue;
public string Name
{
get { return NameValue; }
set { NameValue = value; }
}
private string FilePathValue;
public string FilePath
{
get { return FilePathValue; }
set { FilePathValue = value; }
}
private DataTable DTValue;
public DataTable DT
{
get
{
return DTValue;
}
set
{
DTValue = value;
}
}
public static DataGridProperties DataGridObject(List<DataGridProperties> TBP, int ID = 0, string Name = "")
{
foreach (var tb in TBP)
{
if (tb.ID == ID || tb.Name == Name)
{
return tb;
}
}
return null;
}
public static int FindDataGridID(List<DataGridProperties> DGP, string Name = "")
{
int i = 0;
foreach (var dg in DGP)
{
if (dg.Name == Name)
{
return i;
}
i++;
}
return -1;
}
public static GroupBox DataGridPropertieStackPanel(DataGridProperties DataGrid) // DataGridProperties DataGrid
{
GroupBox GB = new GroupBox();
GB.Header = DataGrid.Header;
StackPanel SPMain = new StackPanel();
SPMain.Orientation = System.Windows.Controls.Orientation.Vertical;
System.Windows.Controls.Label LBDescription = new System.Windows.Controls.Label();
LBDescription.Content = DataGrid.Description;
LBDescription.Margin = new Thickness(10, 0, 0, 0);
SPMain.Children.Add(LBDescription);
StackPanel SP = new StackPanel();
SP.Name = DataGrid.Name;
SP.Orientation = System.Windows.Controls.Orientation.Horizontal;
SP.Margin = new Thickness(10);
System.Windows.Controls.DataGrid DG = new System.Windows.Controls.DataGrid();
DG.Name = DataGrid.Name;
DG.CanUserAddRows = false;
DG.ItemsSource = DataGrid.DT.DefaultView;
SP.Children.Add(DG);
SPMain.Children.Add(SP);
GB.Content = SPMain;
return GB;
}
public static DataTable ConvertCSVtoDataTable(string FilePath)
{
StreamReader sr = new StreamReader(FilePath);
string[] headers = sr.ReadLine().Split(',');
string[] firstLine = sr.ReadLine().Split(',');
DataTable dt = new DataTable();
DataColumn column = new DataColumn();
DataRow fl = dt.NewRow();
int idx = 0;
foreach (string header in headers)
{
//If bool is in first row, turn the column into a checkbox.
if (firstLine[idx].ToLower() == "true" || firstLine[idx].ToLower() == "false")
{
column = dt.Columns.Add(header, typeof(bool));
}
else
{
column = dt.Columns.Add(header, typeof(string));
column.ReadOnly = true;
}
if (header.EndsWith("~"))
{
column.ReadOnly = true;
}
//Reading and building the first row
fl[idx] = firstLine[idx];
idx++;
}
//Adding first row
dt.Rows.Add(fl);
while (!sr.EndOfStream)
{
string line = sr.ReadLine();
string[] rows = line.Split(',');
DataRow dr = dt.NewRow();
for (int i = 0; i < headers.Length; i++)
{
dr[i] = rows[i];
}
dt.Rows.Add(dr);
}
return dt;
}
public static void UpdateDataGridParameter(DataGrid DG)
{
StringBuilder sb = new StringBuilder();
IEnumerable<string> columnNames = DG.Columns.Cast<DataGridColumn>().
Select(column => column.Header.ToString());
sb.AppendLine(string.Join(",", columnNames));
DG.UnselectAllCells();
DG.SelectAllCells();
foreach (DataRowView row in DG.SelectedItems)
{
IEnumerable<string> fields = row.Row.ItemArray.Select(field => field.ToString());
sb.AppendLine(string.Join(",", fields));
}
DG.UnselectAllCells();
var filePath = @"C:\IO\" + DG.Name + ".csv";
File.WriteAllText(filePath, sb.ToString());
}
}
}
更改值后,DataGrid将更新绑定的DataView。您不必选择和取消选择网格行,只需直接访问dataview即可。稍微更改代码的版本:
public static void UpdateDataGridParameter(DataGrid dataGrid)
{
StringBuilder sb = new StringBuilder();
var dataView = dataGrid.ItemsSource as DataView;
var columnNames = dataView.Table.Columns
.Cast<DataColumn>()
.Select(column => column.ColumnName);
sb.AppendLine(string.Join(",", columnNames));
foreach (DataRowView row in dataView)
{
IEnumerable<string> fields = row.Row.ItemArray.Select(field => field.ToString());
sb.AppendLine(string.Join(",", fields));
}
var filePath = @"C:\IO\" + dataGrid.Name + ".csv";
File.WriteAllText(filePath, sb.ToString());
}
更改值后,DataGrid将更新绑定的DataView。您不必选择和取消选择网格行,只需直接访问dataview即可。稍微更改代码的版本:
public static void UpdateDataGridParameter(DataGrid dataGrid)
{
StringBuilder sb = new StringBuilder();
var dataView = dataGrid.ItemsSource as DataView;
var columnNames = dataView.Table.Columns
.Cast<DataColumn>()
.Select(column => column.ColumnName);
sb.AppendLine(string.Join(",", columnNames));
foreach (DataRowView row in dataView)
{
IEnumerable<string> fields = row.Row.ItemArray.Select(field => field.ToString());
sb.AppendLine(string.Join(",", fields));
}
var filePath = @"C:\IO\" + dataGrid.Name + ".csv";
File.WriteAllText(filePath, sb.ToString());
}
使用“ObservableCollection”而不是“List”。也可以参考使用双向绑定。谢谢,Akansha,我将把它作为一个解决方案。使用“ObservableCollection”而不是“List”。也可以参考使用双向绑定。谢谢,Akansha我将把它作为一个解决方案来研究。Gosha-dataView数据集仍然显示未修改的datagrid值。我假设DG.ItemsSource=DataGrid.DT.DefaultView;这就是问题所在。感谢您的输入。Gosha-dataView数据集仍然显示未修改的datagrid值。我假设DG.ItemsSource=DataGrid.DT.DefaultView;这就是问题所在。谢谢你的意见。
public static void UpdateDataGridParameter(DataGrid dataGrid)
{
StringBuilder sb = new StringBuilder();
var dataView = dataGrid.ItemsSource as DataView;
var columnNames = dataView.Table.Columns
.Cast<DataColumn>()
.Select(column => column.ColumnName);
sb.AppendLine(string.Join(",", columnNames));
foreach (DataRowView row in dataView)
{
IEnumerable<string> fields = row.Row.ItemArray.Select(field => field.ToString());
sb.AppendLine(string.Join(",", fields));
}
var filePath = @"C:\IO\" + dataGrid.Name + ".csv";
File.WriteAllText(filePath, sb.ToString());
}