繁体   English   中英

DataGridView中的C#组合框

[英]c# Combobox in datagridview

在我的winform应用程序中,有一个datagrid,要从datagrid插入值,我在按钮click事件中使用以下代码生成了一些组合框:

dgvLoadTable.DataSource = source;
dgvLoadTable.ReadOnly = false;
dgvLoadTable.AllowUserToAddRows = true;

var practices = (from p in context.TOWERIMPORTCLIENTs select p.PRACTICE).Distinct();
for(int r= 0; r < dgvLoadTable.Rows.Count; r++)
{
for(int c = 0; c < dgvLoadTable.Columns.Count; c++)
{
    if(c == 2 || c == 4)
    {
        this.dgvLoadTable[c, r] = new DataGridViewComboBoxCell();
        foreach(var name in practices)
            ((DataGridViewComboBoxCell)dgvLoadTable[c, r]).Items
                                                          .AddRange(practices.ToArray());
    }
  }
}

这仅适用于第一行,当生成第二行时,它没有组合框。 那么,如何检测是否生成了新行?

您完全可以不使用任何代码来执行此操作。 使用设计器将DataGridViewComboBoxColumn添加到您的数据网格中。 将此列绑定到BindingSource (设置数据源属性),该绑定源绑定到List<Practice>并相应地设置DisplayMember和ValueMember。

例如:

  • 您的DataPropertyName将为:练习(这是一个字符串...?)
  • 您的数据源将是一些绑定源PracticesBindingSource(请参见下面的代码)
  • 您的displaymember将是PRACTICE(字符串)
  • 您的价值会员将是PRACTICE(对此不确定)

“编辑列”的属性概述

您的PracticesBindingSource的绑定将非常简单:

public void BindPractices(DbContext context)
{
    PracticesBindingSource.DataSource = (
       from p in context.TOWERIMPORTCLIENTs 
       select p.PRACTICE
       ).Distinct().ToArray();
}

因为您是这样设计界面的,所以datagridview在显示的每一行中的行为都相同。

如果愿意,可以在代码中添加DataGridViewComboBoxColumn。

public void AddDataGridViewComboBoxColumn(DataGridView dgv, string propertyoBindTo)
{
    var dc = new DataGridViewComboBoxColumn();
    dc.DataSource = this.practicesBindingSource;
    dc.DisplayMember = "PRACTICE";
    dc.ValueMember = "PRACTICE";
    dc.DataPropertyName = propertyToBindTo;
    dgv.Columns.Add(dc);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM