DataGridView的DataSet和ComboBox

时间:2017-08-04 04:27:28

标签: c# winforms datagridview combobox dataset

我想在可编辑ComboBox PatientType列中使用DataGridView。 所以我假设创建DataSet并添加基本表"患者"和#34; 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);  

3 个答案:

答案 0 :(得分:1)

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

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

我发布这个建议,尽管Fabio已经链接到一篇好的相关文章,因为该文章使用了类型化的数据集和数据格式视觉设计器,因此可能很难调整它给你的情况提供的建议

答案 1 :(得分:1)

您需要创建DataGridViewComboBoxColumn并设置其DataSourceHeaderTextNameDataPropertyNameValueMember,{{1} }属性

然后将其添加到您的datagridview' s DisplayMember

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

Columns

答案 2 :(得分:0)

我创建了一些示例应用,以了解它应该如何工作。 这是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
}