【问题标题】:Winforms group datagridview value and checkboxlistWinforms组datagridview值和checkboxlist
【发布时间】:2015-04-21 08:21:54
【问题描述】:

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

我的目标:
根据从 datagridview 中选择的记录/行,将从列表中选中某些复选框。例如,一个用户 ID 可能会标记第 5、第 10 和第 12 个角色复选框,而另一个可能是经理的用户 ID 会选中前 10 个角色。在任何情况下都会显示整个复选框,只是选中了不同的框。如果我退出并重新进入,我应该会看到这些相同的值。为了看看它是否让生活更轻松,我有一个文本框,它根据我选择的 datagridview 行显示用户 ID,我认为也许我可以将它与复选框列表链接。但我认为正确的方法是使用数据网格值。

我该怎么做?

代码:

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;

        }









    }
}

【问题讨论】:

    标签: c# winforms datagridview


    【解决方案1】:

    在我看来,您需要在数据库中添加一些额外的表来保存“角色”数据。这是多对多的关系,因此 JoshTestTable 当前保存您的用户数据。您将需要另一个包含角色详细信息的表,如下所示:

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

    下一个表来存储关系:

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

    然后在您的 dataGridView1_CellClick 方法中,您可以查询这两个新表以了解该用户具有哪些角色。比如:

    SELECT T2.RoleID, T2.RoleName
    

    来自 JoshTestTable_Role_REL T1 INNER JOIN 角色 T2 ON T1.RoleID = T2.RoleID WHERE T1.UserID = XXX

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

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

    【讨论】:

    • 感谢您的提示。我尝试了你的建议。我用你建议的列制作了 3 个表格。我将添加到上面的 cellclick 方法代码中。当我尝试运行它(包括通过 SQL)时,我收到一个错误“无法绑定多部分标识符 JoshTestTable.UserID。
    • 看来我必须更改我的 INNER JOIN 。我的 TestTable 有一个 roleID(带有用户信息)或更改它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-27
    • 2012-12-30
    • 2010-11-09
    相关资源
    最近更新 更多