Winforms 组 datagridview 值和复选框列表

Winforms group datagridview value and checkboxlist

我有一个包含 4 列的数据网格视图:用户 ID、名字、姓氏、电子邮件。从 SQL 数据库中检索数据。我目前有 10 条记录 table。我还有一个包含一长串值(角色)的清单框。

我的目标:
基于来自数据网格视图的 record/row selected,将从列表中选中某些复选框。例如,一个 UserID 可能标记了第 5、10 和 12 个角色复选框,而另一个可能是经理的 UserID 将选中前 10 个。无论如何都会显示整个清单框,只是选中了不同的框。如果我退出并返回,我应该会看到相同的值。为了看看它是否让生活更轻松,我有一个文本框显示基于 datagridview 行的 UserID 我 select 想也许我可以 link与复选框列表。但我认为正确的方法是使用数据网格值。

我该怎么做?

代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace SampleDataGrid
{
    public partial class Form1 : Form
    {
        SqlConnection con;
        SqlDataAdapter adap;
        DataSet ds;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            label1.Text = "Search";
            button1.Text = "Search";
            try
            {
                con = new SqlConnection();
                con.ConnectionString = "Data Source=My Data Source";
                con.Open();
                adap = new SqlDataAdapter("select RowID as 'ID',UserID as 'User ID', FirstName as 'First Name', LastName as 'Last Name', email as 'E-mail' from JoshTestTable", con);
                ds = new System.Data.DataSet();
                adap.Fill(ds, "User_Details");
                dataGridView1.DataSource = ds.Tables[0];
                dataGridView1.Columns[0].Visible = false;
            }

            catch (Exception ex)
            {
                MessageBox.Show("Error\n" + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void btnUpdate_Click(object sender, EventArgs e)
        {
            try
            {
                var cmbl = new SqlCommandBuilder(adap);
                adap.Update(ds, "User_Details");
                MessageBox.Show("Successfully Updated.", "Update", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }


        }

        private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
        {
 try
            {
                con = new SqlConnection();
                con.ConnectionString = "My Connection String";
                con.Open();
                adap = new SqlDataAdapter("SELECT JoshRoleTable.RoleID,JoshRoleTable.RoleName FROM Josh_REL_Table INNER JOIN JoshRoleTable ON Josh_REL_Table.RoleID = JoshroleTable.RoleID WHERE JoshTestTable.UserID like '%" + textBox2.Text.Trim() + "%' ", con);
                ds = new System.Data.DataSet();
                adap.Fill(ds, "User_Details");
                dataGridView1.DataSource = ds.Tables[0];
                dataGridView1.Columns[0].Visible = false;

            }

            catch (Exception ex)
            {
                MessageBox.Show("Error\n" + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            if (e.RowIndex >= 0)
            {
                DataGridViewRow row = this.dataGridView1.Rows[e.RowIndex];

                textBox1.Text = row.Cells["User ID"].Value.ToString();
            }


        }

        private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex >= 0)
            {
                DataGridViewRow row = this.dataGridView1.Rows[e.RowIndex];

                textBox1.Text = row.Cells["User ID"].Value.ToString();
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            con = new SqlConnection();
            con.ConnectionString = "My Data Source";
            SqlDataAdapter sda = new SqlDataAdapter("Select UserID, FirstName,LastName,Email FROM JoshTestTable where UserID like '%" + textBox2.Text.Trim() + "%' OR  FirstName like '%" + textBox2.Text.Trim() + "%' OR  LastName like '%" + textBox2.Text.Trim() + "%' OR  Email like '%" + textBox2.Text.Trim() + "%' ", con);
            DataTable dt = new DataTable();
            sda.Fill(dt);
            dataGridView1.DataSource = dt;

        }









    }
}

我觉得您的数据库中需要一些额外的 table 来保存 "roles" 数据。这是多对多关系,因此 JoshTestTable 当前保存您的用户数据。您将需要另一个包含角色详细信息的 table,如下所示:

角色: 角色 ID (INT) 角色名称 (VARCHAR)

下一个 table 来存储关系:

JoshTestTable_Role_REL: 关系 ID (INT) 用户 ID (INT) 角色 ID (INT)

然后在您的 dataGridView1_CellClick 方法中,您可以查询这两个新的 table 以找出该用户拥有的角色。类似于:

SELECT T2.RoleID, T2.RoleName

从JoshTestTable_Role_REL T1 INNER JOIN 角色 T2 ON T1.RoleID = T2.RoleID 其中 T1.UserID = XXX

其中 XXX 是所选用户的用户 ID。

然后循环遍历上述查询返回的记录并相应地启用/禁用复选框。