首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DataGridViewComboBoxColumn DataSource?

DataGridViewComboBoxColumn DataSource?
EN

Stack Overflow用户
提问于 2011-10-05 19:16:47
回答 2查看 21.5K关注 0票数 7

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

  • CodeID
  • CodeName
  • ComboBox with DisplayMember of TypeName,ValueMember of TypeID

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

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

DataGridView使用起来真的很烦人,所以最好有一个解决方案,或者一个可行的替代方案。

编辑:这个问题似乎是因为我想要一个单独的项目为DisplayMemberValueMember。如果我不担心将ID设置为ValueMember,下面的工作是可行的

代码语言:javascript
复制
var typeColumn = new DataGridViewComboBoxColumn
{
    DataSource = typeList,
    DisplayMember = "Type",
    ValueMember = "Type",
    DataPropertyName = "Type"
}

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

代码语言:javascript
复制
var typeColumn = new DataGridViewComboBoxColumn
{
    DataSource = typeList,
    DisplayMember = "Type",
    ValueMember = "TypeID",
    DataPropertyName = "TypeID"
}

如果使用以下内容,将得到一个FormatException错误,因为它试图填充:

代码语言:javascript
复制
var typeColumn = new DataGridViewComboBoxColumn
{
    DataSource = typeList,
    DisplayMember = "Type",
    ValueMember = "TypeID",
    DataPropertyName = "Type"
}

编辑typeList是由以下内容填充的简单DataTable

代码语言:javascript
复制
SELECT DISTINCT IT.InsuranceTypeID, IT.[Type]
FROM InsuranceType IT
WHERE IT.ClientID = @ClientID
ORDER BY [Type]
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-10-06 21:06:50

好的,我想出了一个例子ClientInfoInsuranceDetails,我认为它们可能模仿你想要做的事情。如果这些细节不完全正确,请告诉我。此示例将填充DataGridViewComboBox并根据InsuranceDetails设置值(特别是at:InsurDetailz = all_insurance_types[2])。

代码语言:javascript
复制
   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;
      }
   }
票数 7
EN

Stack Overflow用户

发布于 2011-10-05 19:43:11

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

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

代码语言:javascript
复制
DataGridViewComboBoxColumn categoryColumn = (DataGridViewComboBoxColumn)_ItemsGrid.Columns["CategoryID"];
categoryColumn.DataSource = categories;

_ItemsGrid.DataSource = items;
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7666461

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档