【问题标题】:DataGridViewComboBoxColumn DataSource?DataGridViewComboBoxColumn 数据源?
【发布时间】:2011-12-01 18:15:59
【问题描述】:

我正在尝试在DataGridView 中设置一些东西。看起来这应该很简单,但我遇到了麻烦。我想显示三列:

  • 代码ID
  • 代号
  • DisplayMember 为 TypeName,ValueMember 为 TypeID 的组合框

我希望能够从TypeName 的所有可能值中进行选择。这是我的困境:

如果我将所有这些加载到一个DataTable 并将DataGridView 设置为DataSource,我可以显示该记录的现有TypeName,但组合框将不包含任何其他值。如果我将DataGridViewComboBoxColumnDataSource 设置为单独的DataTable,其中包括所有可能的TypeNames,则不会显示现有值。

DataGridView 使用起来真的很烦人,因此无论是解决方案还是可行的替代方案都将不胜感激。

编辑:看来问题是由于我想为DisplayMemberValueMember 单独设置一个项目。如果我不担心将ID 设置为ValueMember,则以下工作:

var typeColumn = new DataGridViewComboBoxColumn
{
    DataSource = typeList,
    DisplayMember = "Type",
    ValueMember = "Type",
    DataPropertyName = "Type"
}

如果我执行以下操作,则选择了正确的类型,但我无法更改组合框中的选择:

var typeColumn = new DataGridViewComboBoxColumn
{
    DataSource = typeList,
    DisplayMember = "Type",
    ValueMember = "TypeID",
    DataPropertyName = "TypeID"
}

如果我使用以下内容,我会在尝试填充时收到 FormatException 错误:

var typeColumn = new DataGridViewComboBoxColumn
{
    DataSource = typeList,
    DisplayMember = "Type",
    ValueMember = "TypeID",
    DataPropertyName = "Type"
}

编辑typeList 是一个简单的DataTable,由以下内容填充:

SELECT DISTINCT IT.InsuranceTypeID, IT.[Type]
FROM InsuranceType IT
WHERE IT.ClientID = @ClientID
ORDER BY [Type]

【问题讨论】:

  • 您是否在 DGVCBC 上设置 DataPropertyName?此外,史诗般的个人资料图标。 social.msdn.microsoft.com/forums/en-US/winformsdatacontrols/…
  • 您能否发布您如何设置typeList 以及您要添加到列表中的结构? DataPropertyNameValueMember 的类型必须相同,这可能是您在上一个示例中遇到异常的原因。
  • @SwDevMan81 - 当然,请参阅我的编辑。

标签: c# winforms data-binding datagridview datatable


【解决方案1】:

我有一个类似(我认为)的问题,我的解决方案是为DataGridViewComboBoxColumn 设置DataSource 之前DataGridView 设置DataSource

在我的例子中,我的 DataSource 分别是 List<T>BindingList<T>,但它应该与 DataTables 一样工作:

DataGridViewComboBoxColumn categoryColumn = (DataGridViewComboBoxColumn)_ItemsGrid.Columns["CategoryID"];
categoryColumn.DataSource = categories;

_ItemsGrid.DataSource = items;

【讨论】:

  • 不幸的是,这没有帮助。
  • 这在使用 Eloquera 并将一些复杂的类绑定到数据网格时帮助了我很多。谢谢!
【解决方案2】:

好的,我想出了一个示例 ClientInfoInsuranceDetails,我认为这可能会模仿您正在尝试做的事情。让我知道这些细节是否完全正确。此示例将填充DataGridViewComboBox 并根据InsuranceDetails 设置值(具体为:InsurDetailz = all_insurance_types[2]

   public partial class Form1 : Form
   {
      private ClientInfo _myClient;
      private BindingList<InsuranceDetails> all_insurance_types =
         new BindingList<InsuranceDetails>();

      public Form1()
      {
         InitializeComponent();

         DataGridView grid = new DataGridView();
         grid.Dock = DockStyle.Fill;
         grid.AutoGenerateColumns = true;

         all_insurance_types.Add(new InsuranceDetails(1, "Health"));
         all_insurance_types.Add(new InsuranceDetails(2, "Home"));
         all_insurance_types.Add(new InsuranceDetails(3, "Life"));

         var col = new DataGridViewComboBoxColumn
         {
            DataSource = all_insurance_types,
            HeaderText = "Insurance Type",
            DataPropertyName = "InsurDetailz",
            DisplayMember = "ItType",
            ValueMember = "Self",
         };

         _myClient = new ClientInfo { 
            InsurDetailz = all_insurance_types[2], Name = "Jimbo" };
         grid.Columns.Add(col);
         grid.DataSource = new BindingList<ClientInfo> { _myClient };
         this.Controls.Add(grid);

         this.FormClosing += new FormClosingEventHandler(Form1_FormClosing);
      }

      void Form1_FormClosing(object sender, FormClosingEventArgs e)
      {
         // make sure its updated
         InsuranceDetails c = _myClient.InsurDetailz;
         string name = _myClient.Name;
         // Place breakpoint here to see the changes in _myClient 
         throw new NotImplementedException();
      }
   }

   class ClientInfo
   {
      public string Name { get; set; }
      public InsuranceDetails InsurDetailz { get; set; }
   }

   class InsuranceDetails
   {
      public int InsuranceTypeID { get; set; }
      public String ItType { get; set; }
      public InsuranceDetails Self { get { return this; } }

      public InsuranceDetails(int typeId, String itType)
      {
         this.InsuranceTypeID = typeId;
         this.ItType = itType;
      }
   }

【讨论】:

  • 秘密是Self 属性。
猜你喜欢
  • 2018-07-14
  • 2016-10-26
  • 2013-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多