Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.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# MahApps DataGrid无法获取用户输入并写入csv_C#_Wpf_Csv_Datagrid_Mahapps.metro - Fatal编程技术网

C# MahApps DataGrid无法获取用户输入并写入csv

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表示,或者

任何帮助都将不胜感激。对不起,如果我的代码是junior。我是C的新手

问题

我已经使用MahApps在弹出框中动态创建了多个数据网格。数据网格由CSV文件ConvertCSVTodatable填充。我希望用户能够对DataGrids进行更改,当更改完成后,DataGrids值将替换CSV filesUpdateDataGrid参数

UI树:弹出按钮>堆栈面板>组框>数据网格

发行

DG.SelectAllCells不会从用户更改的数据网格中进行选择。如何获取DataGid的可视化UI表示,或者如何将DT属性绑定到数据更改事件。我希望我的解释是正确的。如果你有任何问题,可以帮助我,请张贴,我会迅速回应。谢谢

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());
}