代码之家  ›  专栏  ›  技术社区  ›  StormShadow

在Visual Studio中:如何在DataGridView中显示列表?得到奇怪的东西

  •  1
  • StormShadow  · 技术社区  · 14 年前

    有一段时间了,我自愿在我的公司教自己Windows编程。开始编写VBS脚本,突然意识到这个编程工具是多么有用;-)

    不管怎样,我是C和Visual Studio的新手,我有点了解它的工作原理,你在设计端拖放接口部件,然后在后台/程序端将它们连接在一起。

    我正在尝试编写一个程序,它将(最终)读取一个(非常具体的)csv文件,并为用户提供比excel更友好的编辑和排序方法。应该是简单的东西,我很兴奋。

    我从今天早上开始,在互联网的帮助下,我开始阅读和分析csv(实际上是一个tsv,因为它们使用的不是逗号而是hey)。

    我一直在尝试找出显示信息的最佳方法,至少现在,我使用的是DataGridView。但是数据没有显示。相反,我看到的是一个长网格,其中列标题为length、long length、rank、syncroot、isreadonly、isfixedsize和issynchronized。

    我不知道其中的任何一个意思,也不知道它们来自哪里,不幸的是,我也不知道如何改变它们。也许有人能帮忙?

    这是我的代码:

    using System;
    

    使用system.collections.generic; 使用system.componentmodel; 使用系统数据; 使用系统、图纸; 使用system.linq; 使用system.text; 使用system.windows.forms; 使用system.io;

    命名空间readincsv { 公共部分类readincsv:form { 公共readincsv()。 { 初始化组件(); }

        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 回复  |  直到 11 年前
        1
  •  3
  •   Seb Charrot    14 年前

    这里发生的是,DataGridView试图显示您的 parsedData 名单。

    将DataGridView的数据源设置为对象列表时,它会尝试将每个对象解释为要显示的行。 并行数据 是字符串数组对象的列表,因此网格显示数组对象的所有可显示属性。

    我们可以做的是将每个TSV行解析为一个自定义类(称为TSVRow),该类公开了所有相关数据。然后将tsvrow对象放在列表中并传递到DataGridView。此方法的一个示例在 this article .

    例如:

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

    由于所有列数据都公开为属性(即“column1”和“column2”),因此它们应该自动反映在DataGridView中。

    希望有帮助!如果需要澄清,请告诉我。

        2
  •  3
  •   Hinek    14 年前

    这个 DataGridView 尝试显示字符串数组的属性。你应该设置 AutoGenerateColumns = false 并自己创建列。

    csv/tsv的第一行是否包含列名?是的,你不应该把它们当作 DataSource .

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