Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.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# datagridview,带有填充的组合框并从文本文件读取_C#_Datagridview_Combobox_Text Files - Fatal编程技术网

C# datagridview,带有填充的组合框并从文本文件读取

C# datagridview,带有填充的组合框并从文本文件读取,c#,datagridview,combobox,text-files,C#,Datagridview,Combobox,Text Files,我在这个网站和谷歌上搜索了一个答案,并试图根据我的具体情况调整各种答案,但没有成功。我发现很多“用文本文件或数据库中的值填充组合框”,这不是我需要的。这是在C#中使用Visual Studio 2012 我有一个datagridview,它有4列17行。第一行只是列名。标题下的第一列是每行1-16。该字段的其余部分是组合框,其中包含所有需要保留的预设值。这一切都是通过代码而不是通过属性完成的。因此,如果我只是转到datagridview,它会正确显示,我可以更改值并保存它。我也需要它,当人们打开

我在这个网站和谷歌上搜索了一个答案,并试图根据我的具体情况调整各种答案,但没有成功。我发现很多“用文本文件或数据库中的值填充组合框”,这不是我需要的。这是在C#中使用Visual Studio 2012

我有一个datagridview,它有4列17行。第一行只是列名。标题下的第一列是每行1-16。该字段的其余部分是组合框,其中包含所有需要保留的预设值。这一切都是通过代码而不是通过属性完成的。因此,如果我只是转到datagridview,它会正确显示,我可以更改值并保存它。我也需要它,当人们打开一个文件并显示时,他们可以点击组合框并更改该值

我这样做是为了可以从特定格式的文本文件中读取,但datagridview中的结果是4x17个文本框,其中包含值。位置和值都是正确的,但我需要这些值在预构建的组合框上。文本文件的值将始终是来自预构建组合框的值之一

这是一个很好的网站,可以找到答案,也可以作为解决问题的起点,所以我希望在这方面能得到一些帮助。我尽量说得具体一些,希望你们能理解

这是我打开的对话框和读取的文本文件。我想我需要创建我的组合框,或者将它们的创建链接到我预先构建的组合框,但这就是我遇到的难题

if (openFileDialog1.ShowDialog() == DialogResult.OK)
        {
            System.IO.StreamReader file = new System.IO.StreamReader(openFileDialog1.FileName);
            string[] columnnames = file.ReadLine().Split(',');
            DataTable dt = new DataTable();

            foreach (string c in columnnames)
            {
                dt.Columns.Add(c);                    
            }
            string newline;
            while ((newline = file.ReadLine()) != null)
            {
                DataRow dr = dt.NewRow();
                string[] values = newline.Split(',');
                for (int i = 0; i < values.Length; i++)
                {
                    dr[i] = values[i];
                }
                dt.Rows.Add(dr);
            }
            dataGridView1.DataSource = dt;
            file.Close();

您的代码有一些问题

目前的问题可能是您没有在
DataGridView
中设置列的
DataPropertyName

您可以这样做,在第一段代码的和处,即在设置表之后:

for (int i = 0; i < dataGridView1.Columns.Count; i++)
{
    dataGridView1.Columns[i].DataPropertyName = dt.Columns[i].ColumnName;
}
我注意到(!*!)您只设置了一个
DataGridView.Column
('Channel')的
Name
属性。这是可以的,但有点混乱;试着保持代码的一致性,否则你的(或其他人)会在以后的某个时候开始怀疑它

请注意,我没有做任何检查
DataTable
中的列数是否不少于
DataGridView
中的列数

还请注意,您可以自由地将anyany关联,至少前提是它们的数据类型不冲突。。 我只是认为他们的订单合适

还请注意,值得考虑将
DataTable
声明移到类级别,以便您可以直接从其他代码段访问它。只要它被设置为DGV的
数据源
,它将始终保持在代码中;通过将
dataGridView1.DataSource
转换为
DataTable
,仍然可以访问它,但我认为这会更简单更清晰。为此,您必须在代码中保留实例化,只需移动声明


注意,您通常必须决定datagridview的列是在代码中生成的还是由数据绑定源生成的。对于前一组
dataGridView1.AutoGeneratecolumns=false

谢谢你的帮助。你的回答为我指明了正确的方向。我必须将DataPropertyName添加到预构建的datagridview中。然后我对DataPropertyName做了更多的研究。我在AutoGenerateColumns属性中遇到了一个问题,并通过忽略该问题确定它是在向我的网格中添加列。在开始的时候,我有两个代码字符串,一个添加列,另一个只创建一个文本框网格。所以最后,我在打开对话框之前调用了我的“filldata”,并使用AutoGenerateColumns使其为false。谢谢你的帮助。
for (int i = 0; i < dataGridView1.Columns.Count; i++)
{
    dataGridView1.Columns[i].DataPropertyName = dt.Columns[i].ColumnName;
}
//text column
dataGridView1.ColumnCount = 1;
dataGridView1.Columns[0].Name = "Channel";  // !*!
dataGridView1.Columns["Channel"].ReadOnly = true;
dataGridView1.Rows.Add(16);
for (int i = 1; i <= 16; i++)
{
    dataGridView1[0, i].Value = i + "";
}
..