DataGridViewComboBoxColumn DataSource?

Joh*_*aka 5 c# data-binding datatable datagridview winforms

我正试图在某个地方设置一些东西DataGridView.看起来这应该很简单,但我遇到了麻烦.我想显示三列:

  • 代码ID
  • 代码名称
  • 具有TypeName的DisplayMember,TypeID的ValueMember的ComboBox

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

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

DataGridView 真的很烦人,所以无论是解决方案还是可行的替代方案都将受到赞赏.

编辑:看来这个问题是我想有一个单独的项目引起的DisplayMemberValueMember.以下工作,如果我不担心设置IDValueMember:

var typeColumn = new DataGridViewComboBoxColumn
{
    DataSource = typeList,
    DisplayMember = "Type",
    ValueMember = "Type",
    DataPropertyName = "Type"
}
Run Code Online (Sandbox Code Playgroud)

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

var typeColumn = new DataGridViewComboBoxColumn
{
    DataSource = typeList,
    DisplayMember = "Type",
    ValueMember = "TypeID",
    DataPropertyName = "TypeID"
}
Run Code Online (Sandbox Code Playgroud)

如果我使用以下内容FormatException,则会出现错误,因为它正在尝试填充:

var typeColumn = new DataGridViewComboBoxColumn
{
    DataSource = typeList,
    DisplayMember = "Type",
    ValueMember = "TypeID",
    DataPropertyName = "Type"
}
Run Code Online (Sandbox Code Playgroud)

编辑:typeList是一个简单的DataTable填充如下:

SELECT DISTINCT IT.InsuranceTypeID, IT.[Type]
FROM InsuranceType IT
WHERE IT.ClientID = @ClientID
ORDER BY [Type]
Run Code Online (Sandbox Code Playgroud)

C-P*_*uru 7

我有一个类似的(我认为)问题,我的解决方案是设置DataSourceDataGridViewComboBoxColumn 之前设置DataSourceDataGridView.

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

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

_ItemsGrid.DataSource = items;
Run Code Online (Sandbox Code Playgroud)


SwD*_*n81 5

好吧,我想出了一个例子ClientInfo,并InsuranceDetails说我认为可能会模仿你正在尝试做的。让我知道这些细节是否正确。这个例子将填充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;
      }
   }
Run Code Online (Sandbox Code Playgroud)