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。
然后循环遍历上述查询返回的记录并相应地启用/禁用复选框。
我有一个包含 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。
然后循环遍历上述查询返回的记录并相应地启用/禁用复选框。