【问题标题】:How to display csv file data in unbound data grid view columns如何在未绑定的数据网格视图列中显示 csv 文件数据
【发布时间】:2019-04-07 10:31:23
【问题描述】:

在 Windows 窗体上,我有两个未绑定的数据网格视图列,每个列都有自己的标题,我正在尝试读取数据表中的 csv 文件并将其绑定到网格。

只有我不知道其中的逻辑。我不知道如何将数据绑定到 2 个数据网格视图列。有很多关于如何将 csv 数据绑定到网格视图的示例,但它们处理的是从文件内部读取的标题,而不是未绑定的标题,除了这个但那是 asp.xml 。 Display data on grid view column programmatically

这是来自 csv 文件的数据。

Address,76 Douglas St Wakecorn
Property name,Wakecorn University
Building,C Block
Room,C2.18

这是读取它的类的代码。

    public class Setting
    {
        private DataTable _dt { get; set; }

        public DataTable ProcessSettingFileCMD(string filePath)
        {
            if (_dt == null)
            {
                populateControlWithCSVData(filePath);             
            }
        }

        private void populateControlWithCSVData(string filePath)
        {
            _dt  = new DataTable();            
            string[] lines = File.ReadAllLines(filePath);

            if(lines.Length > 0)
            {
                for(int row = 1; row < lines.Length; row++)
                {
                    string[] dataWords = lines[row].Split(',');
                    DataRow dr = _dt.NewRow();

                    foreach (string word in lines)
                    {
                        dr[word] = dataWords[row++];                        
                    }
                    _dt.Rows.Add(dr);
                }
            }
        }
    }

这是表格

private void mnuOpen_Click(object sender, EventArgs e)
{
    openFD.InitialDirectory = "C:\\";
    openFD.ShowDialog(); 
    _dt = _objSetting.ProcessSettingFileCMD(openFD.FileName);

    if (_dt.Rows.Count > 0)
    {
        gvSettings.DataSource = _dt;
    }
}

返回的错误在dr[word] = dataWords[row++];

System.ArgumentException: '列'地址,76 Douglas St Wakecorn' 不属于表。

【问题讨论】:

  • CSV 中的数据是重复的还是每个文件只有一条记录?此外,您的 CSV 格式不是标准的,因为每条记录位于多行并以标题/名称开头。如果数据是Address, PropertyName, Building, Room 格式并且每条记录在自己的行中,访问数据会更容易
  • CSV 的第一行通常包含列标题(列的名称)。使用该标题创建 DataTable 的列。然后,这不是添加行的方法:dr[word] = dataWords[row++]; =&gt; dr[word] 要么指定列名,要么指定列索引。不是当前字段内容。最后,DataGridView 列必须已经将其DataPropertyName 属性设置为相应的DataTable 列名称。在这种情况下,您还可以自动生成 DGV 列。或者在代码中添加它们,如果需要,指定 DataType。
  • DataRow 有一个简化的构造函数,它使用object[] 作为源。这将是一个字符串数组:你已经拥有了,来自Split()
  • @haldo CSV 重复。所以它在gridview中显示所有数据。它最初有一个循环,可以将 CSV 中的第一行打印为我取出的标题,因为我已经有了未绑定的列。一个未绑定的列用于描述,另一列用于数据。两个未绑定的列都有自己的标题。因此,Description 可以保存“Address”,Data 可以保存“76 Douglas St Wakecorn”。也就是说,您是说将Address, Property name, Building, Room 作为标题更容易?我希望将所有这些作为 csv 值放在描述的一列中。
  • @Jimi 但我想使用我在设计器中制作的未绑定列作为标题。我怎样才能做到这一点?所以我想将Address, PropertyName, Building, Room 作为值绑定到第一列,将Douglas St Wakecorn, Wakecorn University, C Block, C2.18 作为值绑定到第二列。

标签: c# winforms csv datagridview


【解决方案1】:

根据提供的指导和选项,我已取出设计器中制作的列,而是在读取 CSV 文件时对其进行实例化。

我还使用了 CsvFileReader 子类将其绑定到字符串列表,然后绑定到数据表。非常有用! http://www.blackbeltcoder.com/Articles/files/reading-and-writing-csv-files-in-c

这是重写的代码。

设置表单。

public partial class frmSettings : Form
{

        protected string FileName;
        protected bool Modified;
        Setting _objSetting = new Setting();
        OpenFileDialog openFD = new OpenFileDialog();
        DataTable _dt = new DataTable();

        public frmSettings()
        {            
            InitializeComponent();
        }

        private void mnuOpen_Click(object sender, EventArgs e)
        {
            Cursor = Cursors.WaitCursor;
            try
            { 
                openFD.Title = "Open a CSV File";
                if (SaveIfModified())
                {
                    if (openFD.ShowDialog(this) == DialogResult.OK)
                    {
                        _dt = _objSetting.ProcessSettingFileCMD(openFD.FileName);
                        if (_dt.Rows.Count > 0)
                        {
                            gvSettings.DataSource = _dt;
                        }
                    }
                }
                FileName = openFD.FileName;
                Modified = false;
            }
            catch (Exception ex)
            {
                Debug.WriteLine(String.Format("Error reading from {0}.\r\n\r\n{1}", FileName, ex.Message));
            }
            finally
            {
                Cursor = Cursors.Default;
            }            
        }
    }

这里又是设置类。

public class Setting
    {
        private DataTable _dt;
        DataColumn _dclColumnDescription = new DataColumn("Description", typeof(string));
        DataColumn _dclColumnData = new DataColumn("Data", typeof(string));

        public DataTable ProcessSettingFileCMD(string filePath)
        {
            if (_dt == null)
            {
                populateControlWithCSVData(filePath);                
            }
        }

        private void populateControlWithCSVData(string filePath)
        {            
            _dt  = new DataTable();
            List<string> columns = new List<string>();

            using (var reader = new CsvFileReader(filePath))
            {
                _dt.Columns.Add(_dclColumnDescription);
                _dt.Columns.Add(_dclColumnData);
                while (reader.ReadRow(columns))
                {                    
                    _dt.Rows.Add(columns.ToArray());
                }
            }            
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多