【问题标题】:Created Combobox Column of datagridview is not visible inside DataBindingComplete在 DataBindingComplete 中,datagridview 创建的 Combobox 列不可见
【发布时间】:2014-05-30 08:44:28
【问题描述】:

我正在用 C# 开发一个 Windows 窗体应用程序。我有一个显示表格数据的 DataGridView。我使用 Data 表填充网格,并将 Combobox Column 添加到 DataGridView 。我需要根据网格的另一列的值预设 Combox 值。但是,在我想设置组合框的 Idex 的 DataGridView 的 DataBindingComplete 事件中,我看不到新添加的组合框列。下面的代码会更好地解释这件事。

加载 DataGridView 的代码。

        DataTable family = new DataTable();
        family.Columns.Add("tin", typeof(string));
        family.Columns.Add("ftin", typeof(string));
        family.Columns.Add("fullname", typeof(string));
        family.Columns.Add("age", typeof(string));
        family.Columns.Add("gender", typeof(string));
        family.Columns.Add("fathername", typeof(string));
        family.Columns.Add("mothername", typeof(string));

        family.Columns.Add("relationshipid", typeof(string));
        family.Columns.Add("address", typeof(string));

        family.Columns.Add("cat", typeof(string));

//读取数据

  cmd.CommandText = "SELECT        fullname,fathername,mothername,relationshipid,tin,ftin,address,age,gender FROM nprmembers where ftin='" + s.Trim() + "' Order By tin  ";
   var reader = cmd.ExecuteReader();

//

      while (reader.Read())
            {
                  string gndr = GetGender(reader.GetString(8).Trim());
                 family.Rows.Add(reader.GetString(4).TrimStart(),   
    reader.GetString(5).TrimStart(), reader.GetString(0).TrimStart(),  
    reader.GetString(7).TrimStart(), gndr, reader.GetString(1).TrimStart(), 
    reader.GetString(2).TrimStart(), reader.GetString(3).TrimStart(), 
  reader.GetString(6).TrimStart(),"2");


            }
            reader.Close();
            reader.Dispose();

//设置数据源

        dtGrdViewFamily.DataSource = family;
        dtGrdViewFamily.AutoGenerateColumns = false;
        dtGrdViewFamily.Columns[0].HeaderText = "TIN";
        dtGrdViewFamily.Columns[0].Width = 180;
        dtGrdViewFamily.Columns[1].Visible = false;

        dtGrdViewFamily.Columns[2].HeaderText = "Name";
        dtGrdViewFamily.Columns[2].Width = 180;
        dtGrdViewFamily.Columns[3].HeaderText = "DOB";
        dtGrdViewFamily.Columns[3].Width = 70;
        dtGrdViewFamily.Columns[4].HeaderText = "Gender";
        dtGrdViewFamily.Columns[4].Width = 60;
        dtGrdViewFamily.Columns[5].HeaderText = "Father";
        dtGrdViewFamily.Columns[6].HeaderText = "Mother";
        dtGrdViewFamily.Columns[7].HeaderText = "Relation";
        dtGrdViewFamily.Columns[8].HeaderText = "Address";

        dtGrdViewFamily.Columns[9].HeaderText = "cat";
        dtGrdViewFamily.Columns[9].Width = 2;
        dtGrdViewFamily.Columns[9].Visible = false;

我在这里添加新列

//I have added this to stop repeat of this column every time a new set of data is loaded to the grid

 if (dtGrdViewFamily.ColumnCount == 10)
  {
            //Category
            DataGridViewComboBoxColumn rcCategories = new DataGridViewComboBoxColumn();
            rcCategories.HeaderText = "Category";
            rcCategories.DataSource = GetRCCategories();
            rcCategories.DisplayMember = "Values";
            rcCategories.ValueMember = "Keys";
            dtGrdViewFamily.Columns.Add(rcCategories);


        }

此时,网格通过带有一组值的组合框可见。 现在我想用网格另一列的内容设置网格每一行的组合框值。所以我调用 dtGrdViewFamily_DataBindingComplete 事件。代码是

 private void dtGrdViewFamily_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
    {
        foreach(DataGridViewRow row in dtGrdViewFamily.Rows)

        {
            if(!row.IsNewRow)
            {
                row.Cells["Category"].Value = row.Cells["cat"].Value;
                //AT THIS POINT it FAILS TO IDENTIFY THE CATEGORY FIELD
            }
        }

    } 

调试器仅显示 dtGrdViewFamily 的 10 个字段 (0-9)。类别组合框字段丢失。 为什么这样?以及我如何实现预选组合框值的目标。谢谢

【问题讨论】:

    标签: c# winforms datagridview combobox


    【解决方案1】:

    找到了解决办法。 问题似乎是,在加载网格的 Combox 之前调用了 DataBindingComplete。 因此,我将用于将组合框添加到网格的代码转移到 DataBindingComplete 事件中,并使用了 DataGridViewComboBoxCell 而不是 DataGridViewComboBoxColumn。 DatabindingComplete 的更改代码是 -

    private void dtGrdViewFamily_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
        {
             //if(!(dtGrdViewFamily.Columns.Contains("Category"))
             //    return;
            foreach(DataGridViewRow row in dtGrdViewFamily.Rows)
    
            {
                if (!row.IsNewRow)
                {
                DataGridViewComboBoxCell rcCategories = new DataGridViewComboBoxCell();
                rcCategories.DataSource = GetRCCategories();
                rcCategories.DisplayMember = "Values";
                rcCategories.ValueMember = "Keys";
    
                row.Cells[9] = rcCategories;
    
            }
            }
    
        }
    

    现在可以正常使用了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-09
      • 1970-01-01
      • 1970-01-01
      • 2013-08-22
      • 1970-01-01
      • 1970-01-01
      • 2014-06-03
      • 1970-01-01
      相关资源
      最近更新 更多