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 + "\r\n";//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控件。

原文地址:https://www.cnblogs.com/Gitee/p/9082999.html

时间: 2024-11-09 03:50:01

C#在winform上实现关于treeview与listview结合项目应用的相关文章

ACCESS(VBA)上的一个小项目 —— 2、读取ACCESS表数据到TreeView和ListView

有人问我能不能做一个程序的时候,我第一反应都说“能”. --这次在ACCESS中,借助TreeView和ListView做了一个数据联动的模型. 简析过程: 1)从网上找了一份TreeView学习教程<三小时学会树控件>,了解了TreeView的建立以及节点的使用方法: 2)把数据表中的某列按一定规则生成的数据再按一种规则解析成TreeView中的树结构(VPPS): 3)通过遍历TreeView中节点的折叠状态,通过上述一定规则生成的数据(唯一性)把数据表中的内容读取到ListView中:

winform上控件太多,绘制时会逐个出现,通常说双缓冲能解决但实际不能解决的问题的解决方法。

protected override CreateParams CreateParams { get { CreateParams cp = base.CreateParams; cp.ExStyle |= 0x02000000; return cp; } } 接着找办法解决500多个控件PAINT缓慢的效能问题,心塞.分类都不想分了,就这样. winform上控件太多,绘制时会逐个出现,通常说双缓冲能解决但实际不能解决的问题的解决方法.,布布扣,bubuko.com

WinForm上显示gif动画:转

WinForm上的ProgressBar,老实说,实在是不敢恭维,太死板,太难看了,即使做成实时显示处理进度的,它还是逃离不了“难看”.现 在的web2.0上到处都能看到一个显示正在处理的小圆圈在那转啊转,以表示正在处理,虽然它不是实时的,只是个gif动画,但它的效果总感觉要比 winform上的progressBar要赏心悦目的多.那我在winform 上是否也可以用这种gif动画来显示处理进度呢?答案是显然的,肯定可以,听说pictureBox就可以显示gif动画,只要把该控件的image属

提取验证码到winform上webbroswer和axwebbroswer

在网上只有webbroswer的代码,所以自己又修改了修改改成axwebbroswer的 public static class yanZhengMaHelp { //webbrowser验证码 public static Image GetRegCodePic(WebBrowser wbMail, string ImgName, string Src, string Alt) { HTMLDocument doc = (HTMLDocument)wbMail.Document.DomDocum

在LINUX上部署带有JAR包的JAVA项目

         在LINUX上部署带有JAR包的JAVA项目 首先eclipse上要装上一个小插件,叫做Fat Jar 点击Fat Jar 红框里选上主类点击Next 如图把勾打上 在该路径下找到jar包 通过ftp协议把jar包放在linux服务器下 进入到jar包路径 输入指令 java -jar XXX.jar 运行成功! 注意!!!!!!!!!!!!!!!! 当你断开服务器连接时,工程会停止! 所以要用下面的指令 指令:nohup java -jar XXX.jar 通过指令ps -e

GitHub上有很多不错的iOS开源项目

GitHub上有很多不错的iOS开源项目,个人认为不错的,有这么几个:1. ReactiveCocoa:ReactiveCocoa/ReactiveCocoa · GitHub:GitHub自家的函数式响应式编程范式的Objective-C实现,名字听着很高大上,学习曲线确实也比较陡,但是绝对会改变你对iOS编程的认知,首推之.2. Mantle:Mantle/Mantle · GitHub:又是GitHub自家的产物,轻量级建模的首选,也可以很好的配合CoreData工作.3. AFNetwo

GitHub上最受欢迎的Android开源项目TOP20

以下这些开源项目都是从GitHub上筛选的,我强烈推荐android程序源代码有时间的时候自己在上面淘淘,或许能发现自己须要的开源程序. 了解开源项目有两个优点: 1.借鉴代码,一般来说.火爆的开源项目的代码质量都相当高,当我们感觉自己的学习遇到瓶颈的时候,细致研究别人的开源码会让自己受益匪浅. 2.直接用事实上现的功能:android开源项目一般来说都是组件类的,而不是一个完整的应用程序.换句话说,非常多都是提供了一种经常使用功能的解决方式,比方最著名的ActionBarSherlock就是一

Linux上部署web服务器并发布web项目

近在学习如何在linux上搭建web服务器来发布web项目,由于本人是linux新手,所以中间入了不少坑,搞了好久才搞出点成果.以下是具体的详细步骤以及我对此做的一些总结和个人的一些见解,希望对跟我一样的新手们有些帮助,有误的地方还请大神们指出 ??!(以下操作都是在虚拟机中进行) 1.选用CentOS6 64位作为服务器系统. (原因:redhat要钱,而CentOS免费:CentOS相比于其它linux系统要成熟.稳定一点:CentOS7操作命令和目录结构发生了一些变化所以选用版本6) 2.

40个GitHub上最受欢迎的iOS开源项目

40个GitHub上最受欢迎的iOS开源项目(一) http://www.weste.net/2013/8-1/92975.html 40个GitHub上最受欢迎的iOS开源项目(二) http://www.weste.net/2013/8-1/92976.html