C#在winform上实现关于treeview与listview结合项⽬应⽤C#初学:项⽬实现
利⽤treeview实现左边菜单伸缩栏,右侧利⽤listview实现右侧数据显⽰,不同单项对应不同列表,当修改列表时,修改记录会显⽰在textbox⽂本框中。
1.实现treeview树形⽬录:
  ⾸先,在form整体控件上添加Load事件(每当⽤户加载窗体时发⽣),⾥⾯编写两个函数:this.View1);(初始化树形图设置 )、this.View1);(添加节点)。具体代码如下:
private void InitTreeView(TreeView treeView)
  {
  treeView.CheckBoxes = false;//隐藏复选框
  treeView.FullRowSelect = true;//如果单击某项会选择该项及其所有⼦项,则为 true;如果单击某项仅选择项本⾝,则为 false。默认为 false。
  treeView.LabelEdit = false;//不能修改编辑项
  treeView.PathSeparator = "\\";//⽤\符号为分隔符
  treeView.ShowLines = true;//显⽰连线
  treeView.ShowPlusMinus = true;//显⽰+-号
  treeView.ShowRootLines = true;//是否在节点之间绘制连线
listview控件在哪里
  treeView.AfterSelect += new TreeViewEventHandler(treeView_AfterSelect);//委托
  }
  public void AddNode(TreeView treeView)
  {
  //添加节点
  TreeNode node = treeView.Nodes[0];
  treeView.BeginUpdate();
  node.Nodes.Clear();
  //增加分类节点
  TreeNode node1 = new TreeNode("学⽣");
  TreeNode node2 = new TreeNode("⽼师");
  TreeNode node3 = new TreeNode("外勤");
  TreeNode node4 = new TreeNode("管理员");
  node.Nodes.Add(node1);
  node.Nodes.Add(node2);
  node.Nodes.Add(node3);
  node.Nodes.Add(node4);
  treeView.EndUpdate();
  }
2.完成treeview和listview的过渡。完成对树形节点⽬录初步设置后,其中⽤到⼀个重要函数,判断点不同节点会触发何事件。不同事件对应列表不同,第⼀个⼦节点对应Teacher()事件,会有⽼师相关列表,属性有姓名、性别、年龄、科⽬、教龄;第⼆个节点对应Student()事件,会有学⽣相关列表,属性有姓名、性别、年龄、学科、专业;第三个⼦节点对应Waiqin()事件,会有外勤相关列表,属性有姓名、性别、年龄、⾏业、⼯龄;第四个⼦节点对应Guanli()事件,会有管理员相关列表,属性有姓名、性别、年龄、⾏业、区域;各个节点对应事件不同,列表不同。
 private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
  {
  if (e.Node.Parent != null && e.Node.Parent.Index == 0)//当前选中的节点有⽗节点,并且该⽗节点在相同级别的⽗节点中排⾏第⼀。  {
  if (e.Node.Index == 0)
  {
  Teacher();
  listView1.judge = 1;//对应事件设置的⼀个标志,⽤来判断何时对应何事件
  }
  else if (e.Node.Index == 1)
  {
  Student();
  listView1.judge = 2;
  }
  else if (e.Node.Index == 2)
  {
  Waiqin();
  listView1.judge = 3;
  }
  else
  {
  Guanli();
  listView1.judge = 4;
  }
  }
  else
  {
  }
  }
3.listview控件:不同事件对应不同列表
如:
public void Teacher()
  {
  List<Switch> nlist = new List<Switch>();//声明
  var lines1 = File.ReadAllLines(@"excel表的路径");//读⼊excel⽂件数据
  listView1.Clear();//清除数据
  this.listView1.Columns.Add("A", 120, HorizontalAlignment.Left); //⼀步添加添加列表项
  this.listView1.Columns.Add("B", 120, HorizontalAlignment.Left);
  this.listView1.Columns.Add("C", 120, HorizontalAlignment.Left);
  this.listView1.Columns.Add("D", 120, HorizontalAlignment.Left);
  this.listView1.Columns.Add("E", 120, HorizontalAlignment.Left);
  this.listView1.Columns.Add("F", 120, HorizontalAlignment.Left);
  foreach (var item in lines1)//foreach是循环遍历list集合⾥⾯的元素直到遍历完list中的所有元素遍历list时,每次遍历都将list集合中的元素作为var类型赋给item
  {
  string[] values = item.Split(',');//去掉逗号
  if (values[0].ToString() != "Name")//取消读⼊数据不是数据内容,到它的特点,本⾏让操作内容不等于⾮数据内容
  {
    if (values[1].ToString() != "number")
    {
    Switch s2 = new Switch();
    s2.Name = values[0];
    s2.id = values[1];
    nlist.Add(s2);
    this.listView1.Items.Add(new ListViewItem(new String[] {s2.id,s2.Name, "李丽", "⼥", "30", "数学" }));//填充对应⽼师的列表项的内容
    //ListViewItem dc = new ListViewItem();//另⼀种添加列表⽅式
    // dc.Text = s2.id;
    //dc.SubItems.Add(s2.Name);
    /*dc.SubItems.Add("正位");
    dc.SubItems.Add("单锁");
    dc.SubItems.Add("否");
    dc.SubItems.Add("正常");*/
    //listView1.Items.Add(dc);
    }
  }
  }}
4.使列表对应项的内容可修改
思路:在listview中建⼀个textbox⽂件框,对⽂件进⾏设置,当双击listview控件时,触发OnDoubleClick()事件,其中获取屏幕⼯作区坐标,并根据函数可得坐标所点具体项/列,若设置⼀⼆列,不可修改,其他列可修改。蓝⾊代表此部分不涉及相关代码。蓝⾊代表后续需要补充说明函数。
public ListView()
{
m_tb = new TextBox();//⽂件框
m_tb.Multiline = false;
m_tb.Visible = false;
this.GridLines = true;
this.FullRowSelect = true;//可选择同⾏其他列
this.Controls.Add(m_tb);//这个页⾯的控件集中添加⼀个控件
}
protected override void OnDoubleClick(EventArgs e)//⿏标双击空间列表
{
Point tmpPoint = this.PointToClient(Cursor.Position);//获得⿏标所点⼯作区坐标
ListViewItem.ListViewSubItem subitem = this.HitTest(tmpPoint).SubItem;//
ListViewItem item = this.HitTest(tmpPoint).Item;//Item是⼀个整体,举例⼦来说 Item就是⼀个⽂件夹,subItem 就是⽂件夹的⼀些属性
//var _name = SelectedItems[0];
if (subitem != null)
{
switch (judge)
{
case 1:
case 1:
case 3:
if (item.SubItems[5].Equals(subitem))
{
_error = subitem.Text;//其他中textbox2所对应⽂本框显⽰内容
}
else
{
_start = subitem.Text;//textbox1所对应⽂本框显⽰内容
}
break;
case 2:
if (item.SubItems[4].Equals(subitem))
{
_error = subitem.Text;
}
else
{
_start = subitem.Text;
}
break;
case 4:
if (item.SubItems[3].Equals(subitem))
{
_error = subitem.Text;
}
else
{
_start = subitem.Text;
}
break;
}
if (item.SubItems[0].Equals(subitem) || item.SubItems[1].Equals(subitem))//让列表⼀⼆项(列)不可编辑{
}
else
{
EditItem(subitem);//其余项可编辑,编辑函数
}
}
base.OnDoubleClick(e);
}
编辑函数:此段引⽤他⼈代码,若有侵权,联系删除
private void EditItem(ListViewItem.ListViewSubItem subItem)
{
if (this.SelectedItems.Count <= 0)
{
return;
}
Rectangle _rect = subItem.Bounds;//表⽰⼀个矩形的⼤⼩和位置
m_tb.Bounds = new Rectangle(_rect.Left+2,_rect.Top+1,_rect.Width-3,_rect.Height-3);//避免⽹格被遮掉
m_tb.BorderStyle = BorderStyle.None;//⽂本框边框类型
m_tb.BringToFront();//控件的Z顺序则是控件所在的⽗容器上的所有控件的在该⽗容器得的Z轴上的排列
m_tb.Text = subItem.Text;//显⽰⽂本内容
m_tb.Leave += new EventHandler(tb_Leave);//委托
m_tb.TextChanged += new EventHandler(m_tb_TextChanged);
m_tb.Visible = true;//是否显⽰控件

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。