Jordan Nash Ответов: 1

Как я могу перенести строки gridview в таблицу данных и остановить переполнение содержимого таблицы данных методом мутатора?


Я пытаюсь извлечь строковый текст из представления таблицы данных и сохранить его в таблице данных, чтобы сохранить таблицу данных в csv-файл. У меня есть 2 несвязанных столбца, которые я смог прочитать в csv-файле. Один из них-описание. Другой-это данные. Проблема в том, что когда я отлаживаю, я замечаю, что datatable остается нулевым независимо от того, что я делаю. Я все перепробовал.

Кто-нибудь знает, как я могу это исправить? У меня есть метод мутатора под названием ProcessSettingFileCMD, и я понимаю, что перегружаю им таблицу данных, поэтому он никогда не получит фактические строки представления сетки или нулевые данные. Ты хочешь посмотреть
mmuSaveAs_Click
и

Моя форма настроек, содержащая представление таблицы данных.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

public partial class frmSettings : Form

    {
        #region Declarations

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

        #endregion

        #region Initializers
        public frmSettings()
        {            
            InitializeComponent();
            lblMessage.Text = "Please create or open a setting file.";
            gvSettings.DataSource = _dt;
            //Populate_grid_View_with_dummy_data();
        }

        private void Populate_grid_View_with_dummy_data()
        {
            string[] row0 = {"Address", "76 Douglas St Wakecorn"};
            string[] row1 = {"Property name", "Wakecorn University"};
            string[] row2 = {"Building", "C Block"};
            string[] row3 = { "Room", "C2.18"};

            gvSettings.Rows.Add(row0);
            gvSettings.Rows.Add(row1);
            gvSettings.Rows.Add(row2);
            gvSettings.Rows.Add(row3);
        }

        #endregion

        #region Buttons

        private void mnuQuit_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }

        private void btnClose_Click(object sender, EventArgs e)
        {
            if (SaveIfModified())
                Close();
        }
        #endregion Buttons

        #region File menu strip actions
        private void mmuSaveAs_Click(object sender, EventArgs e)
        {
            Cursor = Cursors.WaitCursor;
            saveFD.FileName = FileName;

            try
            {                
                saveFD.Title = "Save a CSV File as desired.";
                saveFD.Filter = "CSV|*.csv";
                saveFD.FileName = "default";
                txtFilePath.Text = openFD.FileName;

                if (saveFD.ShowDialog(this) == DialogResult.OK)
                    _dt = _objSetting.ProcessSettingFileCMD(saveFD.FileName);
            }
            catch (Exception ex)
            {
                Debug.WriteLine(String.Format("Error writing to {0}.\r\n\r\n{1}", FileName, ex.Message));
            }

            finally
            {
                Cursor = Cursors.Default;
            }
        }


Мой класс настроек, в котором таблица данных передается туда и обратно в методы CRUD.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Data;
using CsvFile;
using System.Diagnostics;

public class Setting
    {
        #region Variables

        private int[] _intArrRow;
        private int _intCsvRow = 4;
        private DataTable _dt;
        DataColumn _dclColumnDescription = new DataColumn("Description", typeof(string));
        DataColumn _dclColumnData = new DataColumn("Data", typeof(string));
        #endregion

        #region Mutator Methods

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

            //WRITE
            else if (_dt != null)
            {
                if (_dt.Rows.Count > 0)
                {
                    WriteFile(filePath);
                }
            }
            return _dt;
        }
        #endregion
		
        #region CRUD Methods

        private int GetTotalColumnsInTable()
        {
            int maxColumn = 0;
            foreach (DataRow row in _dt.Rows)
            {
                if (_dt.Columns.Contains("{0}") || _dt.Columns.Contains("{1}")) 
                {
                    for(int col = row.ItemArray.Length -1; col >= 0; col--)
                    {
                        if(row.ItemArray.GetValue(col) != null)
                        {
                            if (maxColumn < (col + 1))
                                maxColumn = (col + 1);
                            continue;
                        }
                    }
                }                
            }
            return maxColumn;
        }

        private void WriteFile(string filename)
        { 
                int numColumns = GetTotalColumnsInTable();
                using (var writer = new CsvFileWriter(filename))//I'm using this guy's class. http://www.blackbeltcoder.com/Articles/files/reading-and-writing-csv-files-in-c
                {
                    foreach (DataRow row in _dt.Rows)
                    {
                        if (row != _dt.Rows[0])
                        {
                            List<string> columns = new List<string>();
                            for (int col = 0; col < numColumns; col++)
                                columns.Add((string)row.ItemArray.GetValue(col) ?? String.Empty);
                            writer.WriteRow(columns);
                        }
                    }
                }                    
        }   
		
		private void populateControlWithCSVData(string filePath)
        {
            _dt = new DataTable();
            List<string> columns = new List<string>();

            using (var reader = new CsvFileReader(filePath))//I'm using this guy's class. http://www.blackbeltcoder.com/Articles/files/reading-and-writing-csv-files-in-c
            {
                _dt.Columns.Add(_dclColumnDescription);
                _dt.Columns.Add(_dclColumnData);
                while (reader.ReadRow(columns))
                {
                    _dt.Rows.Add(columns.ToArray());
                }
            }
        }
        #endregion
	}


Что я уже пробовал:

Я использую библиотеку и проект этого парня http://www.blackbeltcoder.com/Articles/files/reading-and-writing-csv-files-in-c# Я пытаюсь абстрагировать его и интегрировать в свой, потому что мне нужна таблица данных, глобально доступная для приложения. Это было легко с чтением данных из csv, так как я только действительно рефакторинг кода, но теперь, когда я пытаюсь писать в csv, это становится грязным.

Christian Graus

Почему на Земле люди используют ASP.NET-что?

1 Ответов

Рейтинг:
0

Christian Graus

Вы заполняете свой элемент управления из источника данных. Если данные не изменяются, почему бы не работать с источником, а не с элементом управления?


Jordan Nash

Потому что я хочу сопоставить все значения в столбце "данные", чтобы переименовать кучу имен файлов в форме перетаскивания. Значения будут записаны во все файлы. Я хотел, чтобы пользователь создавал csv-файлы одним нажатием кнопки, считывал их содержимое в gridview и печатал его в файл файла. Заголовок описания-это всего лишь столбец метаданных, если они создают несколько файлов и забывают, для чего предназначены все эти данные.

Есть ли что-то неправильное в моем подходе, и если да, то как я могу его оптимизировать?

Christian Graus

Честно говоря, я не совсем понимаю, где вы застряли.