C # в Visual Studio: как отобразить список в DataGridView? Получать странные вещи - PullRequest
1 голос
/ 01 июля 2010

Прошло немного времени, и я вызвался научить себя программированию Windows в своей компании.Начал писать скрипты VBS и внезапно понял, насколько невероятно полезна эта штука для программирования; -)

Во всяком случае, я новичок в C # И Visual Studio, я понимаю, как это работает, вы перетаскиваете интерфейсчасти на стороне дизайна затем соединяют их вместе на задней стороне / стороне программы.

Я пытаюсь написать программу, которая (в конечном счете) будет читать (в очень специфическом виде) CSV-файл и давать пользователюболее удобный способ редактирования и сортировки, чем в Excel.Должны быть простые вещи, и я взволнован этим.

Я начал этим утром и, с помощью Интернета, дошел до чтения и анализа CSV (который на самом деле является TSV, так какони используют вкладки не запятые, а эй).

Я пытался найти лучший способ отображения информации, и, по крайней мере, сейчас я использую DataGridView.Но данные не отображаются.Вместо этого я вижу длинную сетку значений с заголовками столбцов Length, LongLength, Rank, SyncRoot, IsReadOnly, IsFixedSize и IsSynchronized.

Я не знаю, что это означает или откуда они берутсяот, и, к сожалению, я не знаю, как их изменить.Может кто-нибудь может помочь?

Вот мой код:

using System;

using System.Collections.Generic;using System.ComponentModel;используя System.Data;использование System.Drawing;использование System.Linq;используя System.Text;использование System.Windows.Forms;using System.IO;

пространство имен readInCSV {открытый частичный класс readInCSV: Form {public readInCSV () {InitializeComponent ();}

    public List<string[]> parseCSV(string path)
    {
        List<string[]> parsedData = new List<string[]>();
        try
        {
            using (StreamReader readfile = new StreamReader(path))
            {
                string line;
                string[] row;
                while ((line = readfile.ReadLine()) != null)
                {
                    row = line.Split('\t');
                    parsedData.Add(row);
                }
            }
        }
        catch (Exception e)
        {
            MessageBox.Show(e.Message);
        }

        return parsedData;
    }

    //PRIVATE METHODS FROM HERE ON DOWN

    private void btnLoadIn_Click(object sender, EventArgs e)
    {
        int size = -1;
        DialogResult csvResult = openCSVDialog.ShowDialog();

        if (csvResult == DialogResult.OK)
        {
            string file = openCSVDialog.FileName;
            try
            {
                string text = File.ReadAllText(file);
                size = text.Length;
            }
            catch (IOException)
            {
            }
        }
        dgView.Dock = DockStyle.Top;
        dgView.EditMode = DataGridViewEditMode.EditOnEnter;
        dgView.AutoGenerateColumns = true;
        dgView.DataSource = parseCSV(openCSVDialog.FileName);
    }

    private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
    {

    }

    private void openCSVDialog_FileOk(object sender, CancelEventArgs e)
    {

    }
}

}

Заранее спасибо!

Ответы [ 2 ]

3 голосов
/ 01 июля 2010

Здесь происходит то, что DataGridView пытается отобразить всю информацию для каждого из строковых массивов в вашем parsedData списке.

Когда вы устанавливаете DataSridView DataGridView в виде списка объектов, он пытаетсяинтерпретировать каждый из объектов как строку для отображения.parsedData - это список объектов строкового массива, поэтому сетка показывает все отображаемые свойства для объекта массива.

Что мы можем сделать, это проанализировать каждую строку TSV в пользовательский класс (назовите его TsvRow)который имеет все соответствующие данные выставлены.Затем объекты TsvRow помещаются в список и передаются в DataGridView.Пример такого подхода объясняется в этой статье .

Например:

public class TsvRow
{
    // Properties to hold column data
    public string Column1 { get; set; }
    public string Column2 { get; set; }
}

...

public List<TsvRow> parseCSV(string path)
{
    List<TsvRow> parsedData = new List<TsvRow>();

    try
    {
        using (StreamReader readfile = new StreamReader(path))
        {
            string line;
            string[] row;

            while ((line = readfile.ReadLine()) != null)
            {
                row = line.Split('\t');

                // Here we assume we know the order of the columns in the TSV
                // And we populate the object
                TsvRow tsvRow = new TsvRow();
                tsvRow.Column1 = row[0];
                tsvRow.Column2 = row[1];

                parsedData.Add(myObject);
            }
        }
    }
    catch (Exception e)
    {
        MessageBox.Show(e.Message);
    }

    return parsedData;
}

Поскольку все вашиДанные столбца отображаются в виде свойств (т. е. «Столбец1» и «Столбец2»), они должны автоматически отражаться в DataGridView.

Надеюсь, это поможет!Пожалуйста, дайте мне знать, если это нужно уточнить.

3 голосов
/ 01 июля 2010

DataGridView пытается отобразить свойства вашего строкового массива.Вы должны установить AutoGenerateColumns = false и создать столбцы самостоятельно.

Будет ли в первой строке CSV / TSV имена столбцов?Это так, вы не должны передавать их как DataSource.

dgView.AutoGenerateColumns = false;
foreach(string name in columnNames)
{
    dgView.Columns.Add(name, name);
}
...