Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.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的已创建组合框列在DataBindingComplete中不可见_C#_Winforms_Datagridview_Combobox - Fatal编程技术网

C# datagridview的已创建组合框列在DataBindingComplete中不可见

C# datagridview的已创建组合框列在DataBindingComplete中不可见,c#,winforms,datagridview,combobox,C#,Winforms,Datagridview,Combobox,我正在用C#开发一个Windows窗体应用程序。我有一个DataGridView,它显示表中的数据。我使用数据表填充网格,并且在DataGridView中添加了一个Combobox列。我需要根据网格另一列的值预设Combox值。但是,在DataGridView的DataBindingComplete事件中,我想在其中设置组合框的Idex,但我看不到新添加的组合框列。下面的代码可以更好地解释这件事 加载DataGridView的代码 DataTable family = new D

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

加载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();
//

//设置数据源

        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);


        }
此时,网格通过一个带有一组值的组合框可见。 现在我想用网格另一列的内容设置网格每行的Combobox值。所以我称之为dtGrdViewFamily_数据绑定完成事件。代码是

 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)。缺少类别组合框字段。 为什么会这样?以及如何实现预选combobox值的目标。谢谢

找到了解决方案。 问题似乎是,在加载网格的Combox之前调用了DataBindingComplete。 因此,我将用于将combox添加到网格的代码转换为DataBindingComplete事件,该事件使用DataGridViewComboBoxCell而不是DataGridViewComboxColumn。更改后的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;

        }
        }

    }
现在很好用

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;

        }
        }

    }