• C#在winform上实现关于treeview与listview结合项目应用


    C#初学:项目实现

    利用treeview实现左边菜单伸缩栏,右侧利用listview实现右侧数据显示,不同单项对应不同列表,当修改列表时,修改记录会显示在textbox文本框中。

    1.实现treeview树形目录:

      首先,在form整体控件上添加Load事件(每当用户加载窗体时发生),里面编写两个函数:this.InitTreeView(this.treeView1);(初始化树形图设置 )、this.AddNode(this.treeView1);(添加节点)。具体代码如下:

     

    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;//是否在节点之间绘制连线
      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 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;//是否显示控件
    m_tb.Tag = subItem;//获取有关控件的数据对象
    m_tb.Select();//激活控件
    
    }
    
    private void tb_Leave(object sender, EventArgs e)
    {
    m_tb.TextChanged -= new EventHandler(m_tb_TextChanged);
    (sender as TextBox).Visible = false;
    
    }
    
    private void m_tb_TextChanged(object sender, EventArgs e)//文字改变
    {
    if ((sender as TextBox).Tag is ListViewItem.ListViewSubItem)
    {
    (this.m_tb.Tag as ListViewItem.ListViewSubItem).Text = this.m_tb.Text;
    Point tmpPoint = this.PointToClient(Cursor.Position);
    ListViewItem.ListViewSubItem subitem = this.HitTest(tmpPoint).SubItem;
    ListViewItem item = this.HitTest(tmpPoint).Item;
    if (subitem != null)
    {
    switch (judge)
    {
    case 1:
    case 3:
    if (item.SubItems[5].Equals(subitem))
    {
    _finish = this.m_tb.Text;
    }
    else
    {
    _end = this.m_tb.Text;
    }
    break;
    case 2:
    if (item.SubItems[4].Equals(subitem))
    {
    _finish = this.m_tb.Text;
    }
    else
    {
    _end = this.m_tb.Text;
    }
    break;
    
    case 4:
    if (item.SubItems[3].Equals(subitem))
    {
    _finish = this.m_tb.Text;
    }
    else
    {
    _end = this.m_tb.Text;
    }
    break;
    }
    }
    }
    
    }

    5.使修改记录textbox1和其他textbox2显示响应修改过程,此步涉及到前面蓝色部分,以textbox1修改记录为例。

    private void textBox1_Click_1(object sender, EventArgs e)
            {
                string operation;//修改记录
                DateTime t = DateTime.Now;      //获取当前时间,格式为“年/月/日 星期 时/分/秒”
                 if (listView1.SelectedItems.Count > 0)
                {
                    operation = "时间:" + t + " " + "名字:" + listView1.SelectedItems[0].SubItems[1].Text + " " + "改变状态:" + listView1._start + "--->"
     + listView1._end + "
    ";//listView1.SelectedItems[0].SubItems[1].Text 抓取鼠标所在行具体第几项(列)文本,listView1._start 和 listView1._end 蓝字部分已求出
          textBox1.AppendText(operation);//textbox1中添加新内容 
          Application.DoEvents();//刷新 } 
        }

    6.存在问题

    1.在listview里用textbox,虽然实现可编辑,但是有点丑并且文本框会出现可能不会跟随列表移动的问题。

    2.有些代码重复利用,不知如何优化

    3.在修改记录textbox1内,每点击一次都会重复一次记录生成,需要找到若不做修改不生成记录;textbox1修改记录与textbox2其他两个事件一般仅发生一件,不可同时发生,即不可同时生成记录,暂未找到方法。

    4.可尝试用datagridview控件。

     

  • 相关阅读:
    C++Builder中的异常传递
    lpc1343 usb isp not work in linux and mac
    玩玩Hiweed linux 2.0
    有关 stringWithString 和 initWithString
    Windows mobile 中获取内存使用情况
    玩玩xubuntu 8.10
    升级我的ipaq hx2110到Windows Mobile 6.0
    面试技巧 from IBM
    常用Sql语句
    c#的事件机制示例代码: 猫> 老鼠, 主人
  • 原文地址:https://www.cnblogs.com/Gitee/p/9082999.html
Copyright © 2020-2023  润新知