【问题标题】:DataSet and ComboBox of DataGridViewDataGridView的DataSet和ComboBox
【发布时间】:2017-08-04 04:27:27
【问题描述】:

我想在可编辑DataGridView 的PatientType 列 中使用ComboBox。 所以我假设创建DataSet 并添加基本表“Patients”和“PatientTypes”表。

我是否需要在DataSet 中进行更多更改才能实现我的目标?

DataTable table1 = new DataTable("Patients");
table1.Columns.Add("Id");
table1.Columns.Add("Name");
table1.Columns.Add("PatientTypeId");
table1.Rows.Add("sam", 1, 1);
table1.Rows.Add("mark", 2, 2);

DataTable table2 = new DataTable("PatientTypes");
table2.Columns.Add("id");
table2.Columns.Add("Name");
table2.Rows.Add(1, "rich");
table2.Rows.Add(2, "poor");

// Create a DataSet and put both tables in it.
DataSet set = new DataSet("Office");
set.Tables.Add(table1);
set.Tables.Add(table2);  

【问题讨论】:

  • 这取决于您将如何使用它。您需要使用 PatientTypes 表作为 ComboboxColumn 的 DataSOURce。实际上,即使没有 DataTable 也可以做到
  • @Fabio 听起来不错!你介意给我举个例子吗?谢谢!

标签: c# winforms datagridview combobox dataset


【解决方案1】:

不,您不需要对数据集进行更多更改,但您需要将 DataGridView 设置为具有包含以下内容的组合框列:

  • .DataPropertyName 属性设置为您希望组合框编辑的患者列,可能是“PatientTypeId”
  • .DataSource 属性设置为您的 PatientType 数据表
  • .DisplayMember 属性设置为您希望组合显示的内容,可能是“名称”
  • .ValueMember 属性设置为您希望组合框用作 PatientTypeId 的值,可能是“id”

即使 Fabio 已经链接到一篇很好的相关文章,我也会发布此建议,因为该文章使用类型化的数据集和 datagridview 的可视化设计器,因此可能很难根据您的情况调整它提供的建议

【讨论】:

    【解决方案2】:

    您需要创建一个DataGridViewComboBoxColumn 并设置其DataSource、HeaderText、Name、DataPropertyName、ValueMember、DisplayMember 属性

    然后将其添加到您的 datagridview 的 Columns

    以下是代码(使用您的示例数据测试)

    var comboBox = new DataGridViewComboBoxColumn();
        comboBox.DataSource = dataset.Tables["PatientTypes"];
        comboBox.HeaderText = "PatientTypeId";
        comboBox.Name = "PatientTypeId";
        comboBox.DataPropertyName = "PatientTypeId"; //important
        comboBox.ValueMember = "id";
        comboBox.DisplayMember = "Name";
    
    dataGridView1.Columns.Add(comboBox);
    dataGridView1.DataSource = dataset.Tables["Patients"];
    // set the column poition in the grid same as table
    dataGridView1.Columns["PatientTypeId"].DisplayIndex = dataset.Tables["Patients"].Columns["PatientTypeId"].Ordinal;
    

    【讨论】:

      【解决方案3】:

      我创建了一些示例应用程序来看看它应该如何工作。 这是WinForm应用程序的完整代码。

      namespace DataGridAndComboBox
      {
          public partial class Form1 : Form
          {
              List<Users> users = new List<Users>();
      
              List<Months> months = new List<Months>();
      
              public Form1()
              {
                  InitializeComponent();
      
                  dataGridView1.CellValueChanged += DataGridView1_CellValueChanged;
                  Load += Form1_Load;
              }
      
              private void Form1_Load(object sender, EventArgs e)
              {
                  months.Add(new Months() { ID = 1, Name = "Jan" });
                  months.Add(new Months() { ID = 2, Name = "Feb" });
                  months.Add(new Months() { ID = 3, Name = "Mar" });
      
      
                  users.Add(new Users() { ID = 1, MonthID = 1, Name = "Trump" });
                  users.Add(new Users() { ID = 2, MonthID = 2, Name = "Clinton" });
                  users.Add(new Users() { ID = 3, MonthID = 3, Name = "Obama" });
                  users.Add(new Users() { ID = 4, MonthID = 1, Name = "Reygan" });
                  users.Add(new Users() { ID = 5, MonthID = 2, Name = "Kennedi" });
                  users.Add(new Users() { ID = 6, MonthID = 3, Name = "Bush" });
      
              }
      
              //Get data from database
              private void ButtonGetData_Click(object sender, EventArgs e)
              {
                  var bindingSourceMonths = new BindingSource()
                  {
                      DataSource = months
                  };
      
                  #region Create DataGridView columns
      
                  dataGridView1.Columns.Clear();
      
                  var userID = new DataGridViewTextBoxColumn()
                  {
                      HeaderText = "ID user",
                      Width = 50,
                      DataPropertyName = "ID",
                      Name = "ID"
                  };
                  dataGridView1.Columns.Add(userID);
      
                  var userName = new DataGridViewTextBoxColumn()
                  {
                      HeaderText = "User Name",
                      Width = 100,
                      DataPropertyName = "Name",
                      Name = "Name"
                  };
                  dataGridView1.Columns.Add(userName);
      
      
                  var userMonthID = new DataGridViewComboBoxColumn()
                  {
                      HeaderText = "Month",
                      Width = 100,
                      DataPropertyName = "MonthID",
                      DataSource = bindingSourceMonths,
                      ValueMember = "ID",
                      DisplayMember = "Name",
                      Name = "MonthID"
                  };
                  dataGridView1.Columns.Add(userMonthID);
      
                  #endregion
      
                  dataGridView1.DataSource = users;
              }
      
              //Update database
              private void ButtonUpdateData_Click(object sender, EventArgs e)
              {
                  for (int i = 0; i < dataGridView1.Rows.Count; i++)
                  {
                      var userID = (int)dataGridView1.Rows[i].Cells[0].Value;
                      var userName = (string)dataGridView1.Rows[i].Cells[1].Value;
                      var userMonthID = (int)dataGridView1.Rows[i].Cells[2].Value;
                      var m = months.First(x => x.ID == userMonthID);
                  }
              } 
      
              private void DataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
              {
                  if (dataGridView1.Columns[e.ColumnIndex].Name == "MonthID")
                  {
                      Users users = (Users)this.dataGridView1.CurrentRow.DataBoundItem;  
      
                      var monthName = months.First(x => x.ID == users.MonthID);
                  }
              }
          }
      
      
          #region Classes
      
          public class Months
          {
              public int ID { get; set; }
      
              public string Name { get; set; }
          }
      
          public class Users
          {
              public int ID { get; set; }
      
              public string Name { get; set; }
      
              public int MonthID { get; set; }
          }
      
          #endregion
      }
      

      【讨论】:

        猜你喜欢
        • 2013-10-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-27
        • 2017-08-28
        • 2020-06-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多