Как отобразить данные CSV-файла в столбцах просмотра несвязанных данных сетки - PullRequest
0 голосов
/ 07 апреля 2019

В форме окна у меня есть два несвязанных столбца представления таблицы данных, каждый из которых имеет свой собственный заголовок, и я пытаюсь прочитать файл CSV в таблице данных и привязать его к таблице.

Только я не знаю, какая логика задействована. Я не знаю, как связать данные с 2 столбцами представления сетки данных. Существует множество примеров того, как привязать данные CSV к представлению таблицы, но они имеют дело с заголовками, которые считываются из файла, а не с несвязанными, за исключением этого, но это с asp. Программно отображать данные в столбце вида сетки

Вот данные из файла 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 ' не относится к таблице.

1 Ответ

0 голосов
/ 11 апреля 2019

В соответствии с указаниями и опциями, я вынул столбцы, сделанные в конструкторе, и вместо этого создал их при чтении файла 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());
                }
            }            
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...