winforms DataGridViewComboBoxColumn向每行添加不同的项,

5fjcxozz  于 2023-01-31  发布在  其他
关注(0)|答案(7)|浏览(148)

我正在使用DataGridView生成一个表,用户可以在其中从每个单元格的下拉列表中选择项。为了简化问题,假设我有1列。我在设计器中使用DataGridViewComboBoxColumn。我正在尝试支持让该列中的每一行都有不同的项列表可供选择。
这可能吗?

q3aa0525

q3aa05251#

可以。这可以使用DataGridViewComboBoxCell来完成。
下面是一个示例方法,用于将项添加到一个单元格,而不是整个列。

private void setCellComboBoxItems(DataGridView dataGrid, int rowIndex, int colIndex, object[] itemsToAdd)
{
    DataGridViewComboBoxCell dgvcbc = (DataGridViewComboBoxCell) dataGrid.Rows[rowIndex].Cells[colIndex];
    // You might pass a boolean to determine whether to clear or not.
    dgvcbc.Items.Clear();
    foreach (object itemToAdd in itemsToAdd)
    {
        dgvcbc.Items.Add(itemToAdd);
    }
}
ctehm74n

ctehm74n2#

private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
    if (e.ColumnIndex == DataGridViewComboBoxColumnNumber)
    {
        setCellComboBoxItems(myDataGridView, e.RowIndex, e.ColumnIndex, someObj);
    }
}
avkwfej4

avkwfej43#

以防有人找到这个线程,这是我在VB 2008中的解决方案。它提供的优点是允许您为组合框中的每个值分配一个ID。

Private Sub FillGroups()
    Try
        'Create Connection and SQLCommand here.

        Conn.Open()
        Dim dr As SqlDataReader = cm.ExecuteReader

        dgvGroups.Rows.Clear()

        Dim PreviousGroup As String = ""

        Dim l As New List(Of Groups)

        While dr.Read

            Dim g As New Groups
            g.RegionID = CheckInt(dr("cg_id"))
            g.RegionName = CheckString(dr("cg_name"))
            g.GroupID = CheckInt(dr("vg_id"))
            g.GroupName = CheckString(dr("vg_name"))
            l.Add(g)

        End While
        dr.Close()
        Conn.Close()

        For Each a In (From r In l Select r.RegionName, r.RegionID).Distinct

            Dim RegionID As Integer = a.RegionID 'Doing it this way avoids a warning

            dgvGroups.Rows.Add(New Object() {a.RegionID, a.RegionName})

            Dim c As DataGridViewComboBoxCell = CType(dgvGroups.Rows(dgvGroups.RowCount - 1).Cells(colGroup.Index), DataGridViewComboBoxCell)
            c.DataSource = (From g In l Where g.RegionID = RegionID Select g.GroupID, g.GroupName).ToArray
            c.DisplayMember = "GroupName"
            c.ValueMember = "GroupID"
        Next

    Catch ex As Exception
    End Try
End Sub

Private Class Groups

    Private _RegionID As Integer
    Public Property RegionID() As Integer
        Get
            Return _RegionID
        End Get
        Set(ByVal value As Integer)
            _RegionID = value
        End Set
    End Property

    Private _RegionName As String
    Public Property RegionName() As String
        Get
            Return _RegionName
        End Get
        Set(ByVal value As String)
            _RegionName = value
        End Set
    End Property

    Private _GroupName As String
    Public Property GroupName() As String
        Get
            Return _GroupName
        End Get
        Set(ByVal value As String)
            _GroupName = value
        End Set
    End Property

    Private _GroupID As Integer
    Public Property GroupID() As Integer
        Get            
            Return _GroupID
        End Get
        Set(ByVal value As Integer)
            _GroupID = value
        End Set
    End Property

End Class
7kjnsjlb

7kjnsjlb4#

这是具有2个组合框列的gridView的示例,并且当组合框列1所选索引改变时,则用来自数据库的两个不同列的数据加载组合框列2。

private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
        {
              if (dataGridView1.Rows[e.RowIndex].Cells[0].Value != null && dataGridView1.CurrentCell.ColumnIndex == 0)
            {

                SqlConnection conn = new SqlConnection("data source=.;initial catalog=pharmacy;integrated security=true");
                SqlCommand cmd = new SqlCommand("select [drugTypeParent],[drugTypeChild] from [drugs] where [drugName]='" + dataGridView1.Rows[e.RowIndex].Cells[0].Value.ToString() + "'", conn);
                conn.Open();
                SqlDataReader dr = cmd.ExecuteReader();
                while (dr.Read())
                {

                    object[] o = new object[] { dr[0].ToString(),dr[1].ToString() };
                    DataGridViewComboBoxCell dgvcbc = (DataGridViewComboBoxCell)dataGridView1.Rows[e.RowIndex].Cells[1];

                    dgvcbc.Items.Clear();
                    foreach (object itemToAdd in o)
                    {
                        dgvcbc.Items.Add(itemToAdd);
                    }
                }
                dr.Close();
                conn.Close();
               }
            }
gorkyyrv

gorkyyrv5#

在设置数据源后立即设置组合框单元格对我不起作用.它必须在绑定操作完成后进行.我选择了CellBeginEdit
空下拉列表示例:

dgv1.datasource = datatable1;
dgv1.columns.add ( "cbxcol"  , typeof(string) );

//  different source for each comboboxcell in rows
var dict_rowInd_cbxDs = new Dictionary<int, object>();
dict_rowInd_cbxDs[1] = new list<string>(){"en" , "us"};
dict_rowInd_cbxDs[2] = new list<string>(){ "car", "bike"};

// !!!!!! setting comboboxcell after creating doesnt work here
foreach( row in dgv.Rows.asEnumerable() )
{ 
   var cell = res_tn.dgv.CurrentCell as DataGridViewComboBoxCell;
   cell.DataSource = dict_dgvRowI_cbxDs[res_tn.dgv.CurrentCell.RowIndex];

}

工作示例:

dgv1.datasource = datatable1;
dgv1.columns.add ( "cbxcol"  , typeof(string) );

//  different source for each comboboxcell in rows
var dict_rowInd_cbxDs = new Dictionary<int, object>();
dict_rowInd_cbxDs[1] = new list<string>(){"en" , "us"};
dict_rowInd_cbxDs[2] = new list<string>(){ "car", "bike"};

// cmboboxcell datasource Assingment Must be done after  BindingComplete (not tested )  or cellbeginEdit  (tested by me)    
res_tn.dgv.CellBeginEdit += (s1, e1) => {
    if (res_tn.dgv.CurrentCell is DataGridViewComboBoxCell) {
        if (dict_dgvRowI_cbxDs.ContainsKey(res_tn.dgv.CurrentCell.RowIndex)) 
        {
            var cll = res_tn.dgv.CurrentCell as DataGridViewComboBoxCell;
            cll.DataSource = dict_dgvRowI_cbxDs[res_tn.dgv.CurrentCell.RowIndex];

           // required if it is  list<mycustomClass>
           // cll.DisplayMember = "ColName";
           // cll.ValueMember = "This";
        }
    }

};
dly7yett

dly7yett6#

2023.Net7我在这上面浪费了一个小时。正如上面的一些帖子所提到的,填充组合框项必须在数据绑定之后完成,这样对我来说才有效:

dataGridServices.DataBindingComplete += DataGridServices_DataBindingComplete;
dataGridServices.DataError += (sender,e) => { };   // required otherwise DataGridView will complain that "DataGridViewComboBoxCell value is not valid"

private void DataGridServices_DataBindingComplete(object? sender, DataGridViewBindingCompleteEventArgs e)
{
  int nCol = dataGridServices.Columns[nameof(PackageService.CheckMethod)].Index;
  int nRow = 0;
  foreach (var packageService in AllServices)
    SetCellComboBoxItems(nRow++, nCol, packageService.MethodsWithoutParameters);
}

public void SetCellComboBoxItems(int rowIndex, int colIndex, IEnumerable<string> items)
{
  DataGridViewComboBoxCell cell = (DataGridViewComboBoxCell)Grid.Rows[rowIndex].Cells[colIndex];
  cell.MaxDropDownItems = 100;  // not sure if useful. Default is 8, max is 100
  cell.Items.Clear();
  cell.Items.AddRange(items.ToArray());
}
7hiiyaii

7hiiyaii7#

//Populate the Datatable with the Lookup lists
    private DataTable typeDataTable(DataGridView dataGridView, Lookup<string, Element> type_Lookup, Dictionary<Element, string> type_dictionary, string strNewStyle, string strOldStyle, string strID, string strCount)
    {
        int row = 0;

        DataTable dt = new DataTable();

        dt.Columns.Add(strOldStyle, typeof(string));
        dt.Columns.Add(strID, typeof(string));
        dt.Columns.Add(strCount, typeof(int));
        dt.Columns.Add("combobox", typeof(DataGridViewComboBoxCell));


        //Add All Doc Types to ComboBoxes
        DataGridViewComboBoxCell CmBx = new DataGridViewComboBoxCell();
        CmBx.DataSource = new BindingSource(type_dictionary, null);
        CmBx.DisplayMember = "Value";
        CmBx.ValueMember = "Key";

        //Add Style Comboboxes
        DataGridViewComboBoxColumn Data_CmBx_Col = new DataGridViewComboBoxColumn();
        Data_CmBx_Col.HeaderText = strNewStyle;
        dataGridView.Columns.Add(addDataGrdViewComboBox(Data_CmBx_Col, type_dictionary));

        setCellComboBoxItems(dataGridView, 1, 3, CmBx);

        //Add style Rows
        foreach (IGrouping<string, Element> StyleGroup in type_Lookup)
        {
            row++;
            //Iterate through each group in the Igrouping
            //Add Style Rows
            dt.Rows.Add(StyleGroup.Key, row, StyleGroup.Count().ToString());

        }
        return dt;
    }



    private void setCellComboBoxItems(DataGridView dataGrid, int rowIndex, int colIndex, DataGridViewComboBoxCell CmBx)
    {
        DataGridViewComboBoxCell dgvcbc = (DataGridViewComboBoxCell)dataGrid.Rows[rowIndex].Cells[colIndex];
        // You might pass a boolean to determine whether to clear or not.
        dgvcbc.Items.Clear();
        foreach (DataGridViewComboBoxCell itemToAdd in CmBx.Items)
        {
            dgvcbc.Items.Add(itemToAdd);
        }

相关问题