TreeView控件与DataGridView控件联合使用实现数据的拖放显示
知识点概述:
1、DataGridView控件:显示数据库中的记录,如果数据库中存储的一条记录中包含的分类信息过多时需要滑动滚动条来显示。有时因为界面的美观问题容易受到显示且不方便。
2、TreeView控件:提供树形的数据显示,方便直观的显示数据。
3、TreeView控件的相关属性及方法介绍:
add()方法:创建节点
ExpandAll()方法:显示全部节点
注意:在执行相关操作之前要先 将DataGridView控件的AllowUserToAddRows属性设置为false;将TreeView控件的AllowDrop属性设置为true;
总体思维导图:
功能实现代码:
private void 查询_Click(object sender, EventArgs e)
{
SqlConnection sqlConnection = new SqlConnection(); //声明并实例化SQL连接;
sqlConnection.ConnectionString =
ConfigurationManager.ConnectionStrings["ConnString"].ConnectionString; //配置管理器从配置文件读取连接字符串,并将之赋予SQL连接的连接字符串属性;
SqlCommand sqlCommand = new SqlCommand(); //声明并实例化SQL命令;
sqlCommand.Connection = sqlConnection; //将SQL命令的连接属性指向SQL连接;
sqlCommand.CommandText = "SELECT 床号,住院号,姓名,性别,主要诊断 FROM tb_入院记录;"; //指定SQL命令的命令文本;该命令查询所有班级,以用作下拉框数据源;
SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(); //声明并实例化SQL数据适配器;
sqlDataAdapter.SelectCommand = sqlCommand; //将SQL数据适配器的查询命令属性指向SQL命令;
DataTable 入院记录Table = new DataTable(); //声明并实例化数据表,用于保存所有班级,以用作下拉框数据源;
sqlConnection.Open();
sqlDataAdapter.Fill(入院记录Table);
sqlConnection.Close();
this.dgv_住院.Columns.Clear();
this.dgv_住院.DataSource = 入院记录Table;
this.dgv_住院.Columns["床号"].HeaderText = "床号";
this.dgv_住院.Columns["住院号"].HeaderText = "住院号";
this.dgv_住院.Columns["姓名"].HeaderText = "姓名";
this.dgv_住院.Columns["性别"].HeaderText = "性别";
this.dgv_住院.Columns["主要诊断"].HeaderText = "病症";
this.dgv_住院.Columns[this.dgv_住院.Columns.Count - 1].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; //数据网格视图的最后一列的自动调整列宽模式设为填充(至数据网格视图右侧边缘);
TreeNode treeNode = new TreeNode("病人信息", 0, 0);
treeView1.Nodes.Add(treeNode); //默认情况下追加节点
追加节点ToolStripMenuItem.Checked = true;
}
private void dgv_住院_MouseDown(object sender, MouseEventArgs e)
{
if (dgv_住院.SelectedCells.Count != 0)
{
//定义一个二维数组,数组中的每一行代表DataGridView中的一条记录
recordInfo = new string[dgv_住院.Rows.Count, dgv_住院.Columns.Count];
//当按下鼠标左键时,首先获取选定行,记录每一行对应的信息
for (int i = 0; i < dgv_住院.Rows.Count; i++)
{
if (dgv_住院.Rows[i].Selected)
{
for (int j = 0; j < dgv_住院.Columns.Count; j++)
{
recordInfo[i,j] = dgv_住院.Rows[i].Cells[j].Value.ToString();
}
}
}
}
}
//当鼠标进入TreeView控件时,触发的操作
private void treeView1_MouseEnter(object sender, EventArgs e)
{
if (追加节点ToolStripMenuItem.Checked == true)
{
if (recordInfo != null && recordInfo.Length != 0)
{
//用双重for循环遍历数组recordInfo中的内容
for (int i = 0; i < recordInfo.GetLength(0); i++)
{
for (int j = 0; j < recordInfo.GetLength(1); j++)
{
//判断数组中的值是否为空
if (recordInfo[i, j] != null)
{
if (j == 0)
{
//向TreeView中加入节点
TreeNode Node1 = new TreeNode(recordInfo[i,j].ToString());
treeView1.SelectedNode.Nodes.Add(Node1);
treeView1.SelectedNode = Node1;
}
else
{
//添加子级节点下的子节点
TreeNode Node2 = new TreeNode(recordInfo[i,j].ToString());
treeView1.SelectedNode.Nodes.Add(Node2);
}
}
}
treeView1.SelectedNode = treeView1.Nodes[0];
treeView1.ExpandAll();
}
//清空recordInfo中的记录
for (int m = 0; m < recordInfo.GetLength(0); m++)
{
for (int n = 0; n < recordInfo.GetLength(1); n++)
{
recordInfo[m, n] = null;
}
}
}
}
if (清空内容ToolStripMenuItem.Checked == true)
{
if (treeView1.SelectedNode.Nodes.Count != 0)
{
treeView1.SelectedNode.Remove();
TreeNode treeNode = new TreeNode("用户信息", 0, 0);
treeView1.Nodes.Add(treeNode);
treeView1.SelectedNode = treeNode;
if (recordInfo != null && recordInfo.Length != 0)
{
//用双重for循环遍历数组recordInfo中的内容
for (int i = 0; i < recordInfo.GetLength(0); i++)
{
for (int j = 0; j < recordInfo.GetLength(1); j++)
{
//判断数组中的值是否为空
if (recordInfo[i,j] != null)
{
if (j == 0)
{
//向TreeView中加入节点
TreeNode Node1 = new TreeNode(recordInfo[i,j].ToString());
treeView1.SelectedNode.Nodes.Add(Node1);
treeView1.SelectedNode = Node1;
}
else
{
//添加子级节点下的子节点
TreeNode Node2 = new TreeNode(recordInfo[i,j].ToString());
treeView1.SelectedNode.Nodes.Add(Node2);
}
}
}
treeView1.SelectedNode = treeView1.Nodes[0];
treeView1.ExpandAll();
}
//清空recordInfo中的记录
for (int m = 0; m < recordInfo.GetLength(0); m++)
{
for (int n = 0; n < recordInfo.GetLength(1); n++)
{
recordInfo[m, n] = null;
}
}
}
追加节点ToolStripMenuItem.Checked = true;
清空内容ToolStripMenuItem.Checked = false;
}
}
}
private void 清空内容ToolStripMenuItem_Click(object sender, EventArgs e)
{
if (追加节点ToolStripMenuItem.Checked == true)
{
清空内容ToolStripMenuItem.Checked = true;
追加节点ToolStripMenuItem.Checked = false;
}
}
private void 追加节点ToolStripMenuItem_Click(object sender, EventArgs e)
{
if (清空内容ToolStripMenuItem.Checked == true)
{
追加节点ToolStripMenuItem.Checked = true;
清空内容ToolStripMenuItem.Checked = false;
}
}