【问题标题】:C# Read List values into Textboxes [duplicate]C#将列表值读入文本框[重复]
【发布时间】:2018-02-11 20:13:20
【问题描述】:

我已经被这个问题困扰了一段时间了。我能够从一堆(100)文本框中读取信息并将数据保存到 CSV 文件中,但是将这些信息读回表单让我有点困惑,我只是想加载前 11 个字符串开始.我可以将 CSV 加载到列表中,但我似乎无法将该数据从列表移动到我的文本框。我的方法有什么遗漏吗?

        public List<string> LoadCsvFile(string filePath)
    {
        var reader = new StreamReader(File.OpenRead(filePath));
        List<string> searchList = new List<string>();


        while (!reader.EndOfStream)
        {
            var line = reader.ReadLine();
            searchList.Add(line);
            for (int i = 0; i < 11; i++)
            {
                string date = searchList[i];
                string dropdownindex = searchList[i];
                LasttextBox.Text = searchList[i];
                FirsttextBox.Text = searchList[i];
                EmailtextBox.Text = searchList[i];
                PhonetextBox.Text = searchList[i];
                HometextBox.Text = searchList[i];
                InfotextBox.Text = searchList[i];
                PrimarytextBox.Text = searchList[i];
                EmailtextBox.Text = searchList[i];
                SecondaryEmailtextBox.Text = searchList[i];
            }
        }
        return searchList;
    }

我得到的错误是:

System.ArgumentOutOfRangeException: '索引超出范围。一定是 非负数且小于集合的大小。参数名称: 索引'

感谢您提供的任何帮助。

【问题讨论】:

  • 同一部分你读了 11 遍。然后你重复这个直到你成为文件。
  • 那里有相当数量没有意义。至于异常,触手可及的令人敬畏的调试器会向您展示一些问题。当您阅读第一行时,该列表中没有 11 项内容。如果它是 CSV,当你阅读它时它仍然是一行,所以你试图一遍又一遍地在每个 Text 控件中放置同一行
  • 使用调试器浏览您的代码。然后你会看到你添加了 1 行并立即循环遍历 11 个列表项。然后为所有文本框分配相同的值。
  • 您还需要在 Google 上搜索实际的错误消息作为基础研究:本网站上针对该异常的 3600 c# 相关帖子

标签: c# list csv


【解决方案1】:

您将行与字段混淆,并且您甚至不需要根据您正在尝试执行的操作的列表。您似乎正在尝试将字段值分配给您的文本框。

假设您的 csv 文件如下所示(顺便说一下,您的电子邮件文本框已复制):

日期、DropDownIndex、姓氏、名字、电子邮件、电话、家庭、信息、主要、电子邮件、次要电子邮件

您可以使用 Linq 将您的 CSV 文件解析为具有您想要的所有值的匿名类,然后循环遍历并将这些值分配给您的文本框

例如:

var csvRecords = File
            .ReadAllLines(filePath)
            .Select(c => c.Split(',')).Select(c => new
            {
                Date = c[0],
                DropDown = c[1],
                LastName = c[2],
                FirstName = c[3],
                Email = c[4],
                Phone = c[5],
                Home = c[6],
                Info = c[7],
                Primary = c[8],
                Email2 = c[9],
                SecondaryEmail = c[10]
            }).ToList();

foreach (var csvRecord in csvRecords)
        {
            var date = csvRecord.Date;
            var dropdownindex = csvRecord.DropDown;
            LasttextBox.Text = csvRecord.LastName;
            FirsttextBox.Text = csvRecord.FirstName;
            EmailtextBox.Text = csvRecord.Email;
            PhonetextBox.Text = csvRecord.Phone;
            HometextBox.Text = csvRecord.Home;
            InfotextBox.Text = csvRecord.Info;
            PrimarytextBox.Text = csvRecord.Primary;
            EmailtextBox.Text = csvRecord.Email2;
            SecondaryEmailtextBox.Text = csvRecord.SecondaryEmail;
        }

您需要考虑的一些事项是,您的 CSV 文件是否仅包含逗号分隔符且没有双引号限定符,因为实际值中可能存在逗号,这会影响您各个字段的位置。如果您仍想通过该方法返回 List,则无法返回匿名类型列表,因此您需要创建一个类,然后在 Linq 选择中使用 new 而不是使用 new 和 assign字段的方式相同。

【讨论】:

  • 这个解决方案最适合我的场景。我确实对 CSV 有问题,因为(正如您所指出的)我无法导航到没有逗号的第二行字段来结束第一行数据。我的 CSV 看起来像这样: 11-Feb,0,a,b,c,d,e,f,g,h,i 11-Feb,1,j,k,l,m,n,o,p,q ,r 对读取 CSV 中的第二行有什么建议吗?
【解决方案2】:

这种方法更具可扩展性,即,只要您可以控制文本框的名称,它就可以处理任意数量的 csv 文件行和/或文本框。此设计忽略了 csv 文件中没有用于

的文本框的行
public Form1()
{
    InitializeComponent();

    //simulate a list loaded from a csv file
    IList<string> stringsFromCsv = new List<string>
    {
        "from csv line dog",
        "from csv line cat",
        "from csv line fish",
        "from csv line frog",
        "from csv line squirrel",
        "from csv line turtle",
        "from csv line squid",
        "from csv line bass",
        "from csv line tiger",
        "from csv line lion"
    };

    //make a collection of all the controls in the groupbox (or form, or whatever)
    Control.ControlCollection controls = groupBox1.Controls;

    int listIndex = 0;

    //loop based on the number of items from the csv file
    while (listIndex <= stringsFromCsv.Count - 1)
    {
        //create a text box name from the current list index
        string expectedTextBoxName = "textBox" + ((listIndex + 1).ToString());

        //this is brute force, but step thru all the controls until
        //you find a text box whose name matches 
        foreach (Control control in controls)
        {
            //skip the control if its not a text box
            if (control.GetType().Name != "TextBox")
                continue;

            if (control.Name == expectedTextBoxName)
            {
                control.Text = stringsFromCsv[listIndex];
                break;
            }

        }

        listIndex = listIndex + 1;

        if (listIndex > stringsFromCsv.Count - 1)
            break;
    }
}

【讨论】:

    猜你喜欢
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 2018-12-15
    • 2013-09-19
    • 2015-03-16
    • 2012-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多