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

时间:2015-10-28 15:09:42

标签: c# datagridview combobox text-files

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

我有一个包含4列和17行的datagridview。第一行只是列名。标题下的第一列是每行#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();

这是我预先构建的组合框代码。组合框中的值需要保留。我将它构建为一个构造函数,因为我在表单的加载中使用它但是我改变了它,并在需要时调用它。

private void filldata()
    {
        //text column
        dataGridView1.ColumnCount = 1;
        dataGridView1.Columns[0].Name = "Channel";
        dataGridView1.Columns["Channel"].ReadOnly = true;
        dataGridView1.Rows.Add();
        dataGridView1[0, 0].Value = "1";
        dataGridView1.Rows.Add();
        dataGridView1[0, 1].Value = "2";
        dataGridView1.Rows.Add();
        dataGridView1[0, 2].Value = "3";
        dataGridView1.Rows.Add();
        dataGridView1[0, 3].Value = "4";
        dataGridView1.Rows.Add();
        dataGridView1[0, 4].Value = "5";
        dataGridView1.Rows.Add();
        dataGridView1[0, 5].Value = "6";
        dataGridView1.Rows.Add();
        dataGridView1[0, 6].Value = "7";
        dataGridView1.Rows.Add();
        dataGridView1[0, 7].Value = "8";
        dataGridView1.Rows.Add();
        dataGridView1[0, 8].Value = "9";
        dataGridView1.Rows.Add();
        dataGridView1[0, 9].Value = "10";
        dataGridView1.Rows.Add();
        dataGridView1[0, 10].Value = "11";
        dataGridView1.Rows.Add();
        dataGridView1[0, 11].Value = "12";
        dataGridView1.Rows.Add();
        dataGridView1[0, 12].Value = "13";
        dataGridView1.Rows.Add();
        dataGridView1[0, 13].Value = "14";
        dataGridView1.Rows.Add();
        dataGridView1[0, 14].Value = "15";
        dataGridView1.Rows.Add();
        dataGridView1[0, 15].Value = "16";

        //combo box
        DataGridViewComboBoxColumn freqRXTX = new DataGridViewComboBoxColumn();
        freqRXTX.HeaderText = "Frequency (MHz)";
        String[] RXTX = { "", "467.0", "471.9", "474.4", "477.0", "479.7" };
        freqRXTX.Items.AddRange(RXTX);
        dataGridView1.Columns.Add(freqRXTX);

        DataGridViewComboBoxColumn CTCSSfreq = new DataGridViewComboBoxColumn();
        CTCSSfreq.HeaderText = "CTCSS (Hz)";
        String[] CTCSS = { "none", "67.0", "71.9", "74.4", "77.0", "79.7", "82.5", "85.4", "88.5", "91.5", "94.8", "97.4", "100.0", "103.5", "107.2", "110.9", "114.8", "118.8", "123.0", 
        "127.3", "131.8", "136.5", "141.3", "146.2", "151.4", "118.8", "123.0", "127.3", "131.8", "136.5", "141.3", "146.2", "151.4", "210.7", "218.1", "225.7", "233.6", "241.8", "250.3"};
        CTCSSfreq.Items.AddRange(CTCSS);
        dataGridView1.Columns.Add(CTCSSfreq);

        DataGridViewComboBoxColumn DCSfreq = new DataGridViewComboBoxColumn();
        DCSfreq.HeaderText = "DCS (Hz)";
        String[] DCS = { "none", "23", "25", "26", "31", "32", "43", "47", "51", "54", "65", "71", "72", "73", "74", "114", "115", "116", "125", "131", "132", "134", "143", "152", "155", "156", "162", "165",
        "172", "174", "205", "223", "226", "243", "244", "245", "251", "261", "263", "265", "271", "306", "311", "315", "331", "343", "346", "351", "364", 
        "365", "371", "411", "412", "413", "423", "431", "432", "445", "464", "465", "466", "503", "506", "516", "532", "546", "565", "606", "612", "624",
        "627", "631", "632", "654", "662", "664", "703", "712", "723", "731", "732", "734", "743", "754" };
        DCSfreq.Items.AddRange(DCS);
        dataGridView1.Columns.Add(DCSfreq);

1 个答案:

答案 0 :(得分:0)

您的代码存在一些问题。

手头的一个可能是你没有在DataPropertyName中设置DataGridView列。

你可以这样做,在第一段代码中,即在设置表格之后:

for (int i = 0; i < dataGridView1.Columns.Count; i++)
{
    dataGridView1.Columns[i].DataPropertyName = dt.Columns[i].ColumnName;
}

您仍然需要先调用第二部分,因为它会设置DataGridView

在其中你可以简化这样的设置:

//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 + "";
}
..

我注意到(!*!)您只设置了一个Name('频道')的DataGridView.Column属性。这没关系,但有点混乱;尽量让你的代码保持一致,否则你的(或其他人)会在以后的某个时候开始怀疑它。

请注意,我没有对DataTable中的列数进行任何检查,并且不会小于DataGridView中的列数。

另请注意,您可以将任何 DataGridView.Column任意 DataTable.Column相关联,至少只要他们的数据类型不相关冲突.. 我只是假设他们的订单适合..

另请注意,将DataTable声明移到类级别是值得考虑的,因此您可以直接从其他代码段访问它。只要它被设置为DGV DataSource,它就会保留在代码中。并且仍然可以通过将dataGridView1.DataSource转换为DataTable来访问它,但它会更简单,更清晰,即可。为此,您必须在代码中保留实例化,只需移动声明!

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