C# datagridview,带有填充的组合框并从文本文件读取
我在这个网站和谷歌上搜索了一个答案,并试图根据我的具体情况调整各种答案,但没有成功。我发现很多“用文本文件或数据库中的值填充组合框”,这不是我需要的。这是在C#中使用Visual Studio 2012 我有一个datagridview,它有4列17行。第一行只是列名。标题下的第一列是每行1-16。该字段的其余部分是组合框,其中包含所有需要保留的预设值。这一切都是通过代码而不是通过属性完成的。因此,如果我只是转到datagridview,它会正确显示,我可以更改值并保存它。我也需要它,当人们打开一个文件并显示时,他们可以点击组合框并更改该值 我这样做是为了可以从特定格式的文本文件中读取,但datagridview中的结果是4x17个文本框,其中包含值。位置和值都是正确的,但我需要这些值在预构建的组合框上。文本文件的值将始终是来自预构建组合框的值之一 这是一个很好的网站,可以找到答案,也可以作为解决问题的起点,所以我希望在这方面能得到一些帮助。我尽量说得具体一些,希望你们能理解 这是我打开的对话框和读取的文本文件。我想我需要创建我的组合框,或者将它们的创建链接到我预先构建的组合框,但这就是我遇到的难题C# datagridview,带有填充的组合框并从文本文件读取,c#,datagridview,combobox,text-files,C#,Datagridview,Combobox,Text Files,我在这个网站和谷歌上搜索了一个答案,并试图根据我的具体情况调整各种答案,但没有成功。我发现很多“用文本文件或数据库中的值填充组合框”,这不是我需要的。这是在C#中使用Visual Studio 2012 我有一个datagridview,它有4列17行。第一行只是列名。标题下的第一列是每行1-16。该字段的其余部分是组合框,其中包含所有需要保留的预设值。这一切都是通过代码而不是通过属性完成的。因此,如果我只是转到datagridview,它会正确显示,我可以更改值并保存它。我也需要它,当人们打开
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
中的列数
还请注意,您可以自由地将anyDataTable
声明移到类级别,以便您可以直接从其他代码段访问它。只要它被设置为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 + "";
}
..