C# DataGridView的数据集和组合框

C# DataGridView的数据集和组合框,c#,winforms,datagridview,combobox,dataset,C#,Winforms,Datagridview,Combobox,Dataset,我想在可编辑的DataGridView的PatientType列中使用ComboBox。 所以我假设创建数据集,并添加基本表“Patients”和“PatientTypes”表 我是否需要在数据集中进行更多更改以实现我的目标 DataTable table1 = new DataTable("Patients"); table1.Columns.Add("Id"); table1.Columns.Add("Name"); table1.Columns.Add("PatientTypeId");

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

我是否需要在
数据集中进行更多更改以实现我的目标

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);  

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

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

尽管Fabio已经链接到一篇很好的相关文章,但我还是发布了这条建议,因为该文章使用了datagridview的类型化数据集和可视化设计器,因此可能很难根据您的情况调整它给出的建议

不,您不需要对数据集进行更多更改,但您确实需要将DataGridView设置为具有以下内容的combobox列:

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

尽管Fabio已经链接到一篇很好的相关文章,但我还是发布了这条建议,因为这篇文章使用了datagridview的类型化数据集和可视化设计器,因此很难根据您的情况调整它给出的建议

您需要创建一个
DataGridViewComboBoxColumn
并设置其
数据源,
标题文本
名称
数据属性名称
值成员
显示成员
属性

然后将其添加到datagridview的
列中

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


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

然后将其添加到datagridview的
列中

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


我创建了一些示例应用程序,看看它应该如何工作。 下面是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
}
命名空间DataGridAndComboBox
{
公共部分类Form1:Form
{
列表用户=新列表();
列表月份=新列表();
公共表格1()
{
初始化组件();
dataGridView1.CellValueChanged+=dataGridView1\u CellValueChanged;
荷载+=形式1_荷载;
}
私有void Form1\u加载(对象发送方、事件参数e)
{
添加(新月份(){ID=1,Name=“Jan”});
添加(新月份(){ID=2,Name=“Feb”});
添加(新月份(){ID=3,Name=“Mar”});
添加(新用户(){ID=1,MonthID=1,Name=“Trump”});
添加(新用户(){ID=2,MonthID=2,Name=“Clinton”});
添加(新用户(){ID=3,MonthID=3,Name=“Obama”});
添加(新用户(){ID=4,MonthID=1,Name=“Reygan”});
添加(新用户(){ID=5,MonthID=2,Name=“Kennedi”});
添加(新用户(){ID=6,MonthID=3,Name=“Bush”});
}
//从数据库获取数据
私有无效按钮数据单击(对象发送者,事件参数e)
{
var bindingSourceMonths=new BindingSource()
{
数据源=月
};
#区域创建DataGridView列
dataGridView1.Columns.Clear();
var userID=new DataGridViewTextBoxColumn()
{
HeaderText=“ID user”,
宽度=50,
DataPropertyName=“ID”,
Name=“ID”
};
dataGridView1.Columns.Add(userID);
var userName=新DataGridViewTextBoxColumn()
{
HeaderText=“用户名”,
宽度=100,
DataPropertyName=“Name”,
Name=“Name”
};
dataGridView1.Columns.Add(用户名);
var userMonthID=new datagridviewcomboxcolumn()
{
HeaderText=“月”,
宽度=100,
DataPropertyName=“MonthID”,
DataSource=bindingSourceMonths,
ValueMember=“ID”,
DisplayMember=“Name”,
Name=“MonthID”
};
dataGridView1.Columns.Add(userMonthID);
#端区
dataGridView1.DataSource=用户;
}
//更新数据库
私有无效按钮更新数据\单击(对象发送者,事件参数e)
{
对于(int i=0;ix.ID==userMonthID);
}
} 
私有void DataGridView1\u CellValueChanged(对象发送方,DataGridViewCellEventArgs e)
{
if(dataGridView1.Columns[e.ColumnIndex].Name==“MonthID”)
{
Users Users=(Users)this.dataGridView1.CurrentRow.DataBoundItem;
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
}