Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C将列表值读入文本框_C#_List_Csv - Fatal编程技术网

C# C将列表值读入文本框

C# C将列表值读入文本框,c#,list,csv,C#,List,Csv,我已经在这个问题上纠缠了一段时间了。我能够从100个文本框中读取信息,并将数据保存到CSV文件中,但将这些信息读回表单让我有点困惑,我只是尝试加载前11个字符串。我可以将CSV加载到列表中,但似乎无法将该数据从列表移动到文本框中。我的方法有什么遗漏吗 public List<string> LoadCsvFile(string filePath) { var reader = new StreamReader(File.OpenRead(fil

我已经在这个问题上纠缠了一段时间了。我能够从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:'索引超出范围。必须是 非负数且小于集合的大小。参数名称: 索引'


我非常感谢您提供的任何帮助。

您将行与字段混淆,而且您甚至不需要基于您试图执行的操作的列表。似乎您正在尝试将字段值指定给文本框

假设您的csv文件与下面的类似,您可以通过以下方式复制电子邮件文本框:

日期,下拉索引,姓氏,姓氏,电子邮件,电话,家庭,信息,主要,电子邮件,次要电子邮件

您可以使用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文件只包含逗号分隔符,而没有双引号限定符,因为在实际值中可能会有逗号,这样会抛出各个字段的位置。如果您仍然希望通过该方法返回列表,则无法返回匿名类型的列表,因此您需要创建一个类,然后使用new并以相同的方式分配字段,而不是在Linq select中使用new。,只要您能够控制文本框的名称,它就可以处理任意数量的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;
    }
}

同一部分你读了11遍。你重复这一步,直到你被记录在案。有相当一部分是没有意义的。至于例外情况,指尖上的很棒的调试器会向您显示一些问题。当你阅读第一行时,列表中没有11件事。如果它是一个CSV,那么当您读取它时,它仍然是一行,因此您试图在每个文本控件中放置相同的行,并使用调试器遍历代码。然后您会看到您添加了一行,并立即循环11个列表项。然后将相同的值分配给所有文本框。您还需要谷歌搜索实际的错误消息作为基础研究:该网站上的3600篇与c相关的文章,用于该例外。此解决方案最适合我的情况。我确实对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第二行有什么建议吗?