如何让C#中listview控件显示多行多列数据?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何让C#中listview控件显示多行多列数据?相关的知识,希望对你有一定的参考价值。

先添加好列,再添加行。其中行就是项、子项。

C#是微软公司发布的一种面向对象的、运行于.NET Framework之上的高级程序设计语言。并定于在微软职业开发者论坛(PDC)上登台亮相。

价值:

C#是微软公司研究员Anders Hejlsberg的最新成果。C#看起来与Java有着惊人的相似;它包括了诸如单一继承、接口、与Java几乎同样的语法和编译成中间代码再运行的过程。但是C#与Java有着明显的不同,它借鉴了Delphi的一个特点,与COM(组件对象模型)是直接集成的,而且它是微软公司 .NET windows网络框架的主角。

目标:

C#旨在设计成为一种“简单、现代、通用”,以及面向对象的程序设计语言,此种语言的实现,应提供对于以下软件工程要素的支持:强类型检查、数组维度检查、未初始化的变量引用检测、自动垃圾收集。软件必须做到强大、持久,并具有较强的编程生产力。此种语言为在分布式环境中的开发提供适用的组件开发应用。

用途:

C#适合为独立和嵌入式的系统编写程序,从使用复杂操作系统的大型系统到特定应用的小型系统均适用。

参考技术A 先添加好列,再添加行。
行就是项、子项追问

是点歌系统,查询后只显示一行数据,我希望再次查询时,之前的数据还在,该怎么办呢?

追答

查询后只显示一行数据。可能是你查询结果集里只获得了一行数据

参考技术B   ListView我认为是种数据型的控件,以装载和展示数据为目的,当然也能展示图片,这个功能没有试过。这里讲一下ListView的第一次使用后的一些小结。
  
  ListView一些设置与添加字段。
  Lv1 = new ListView ( ) ; //实例化
  Lv1.GridLines = true ; file://显示各个记录的分隔线
  Lv1.FullRowSelect = true ; file://要选择就是一行
  Lv1.View = View.Details ; file://定义列表显示的方式
  Lv1.Scrollable = true ; file://需要时候显示滚动条
  Lv1.MultiSelect = false ; // 不可以多行选择
  listView1.Items.Remove(listView1.SelectedItems[0]); //这样可以在ListView中删除选择的行
  Lv1.HeaderStyle = ColumnHeaderStyle.Nonclickable ;// 针对数据库的字段名称,建立与之适应显示表头
  
  设置列名称:
  Lv1.Columns.Add ( "A" , 60 , HorizontalAlignment.Right ) ;
  Lv1.Columns.Add ( "B" , 100 , HorizontalAlignment.Left ) ;
  Lv1.Columns.Add ( "C" , 100 , HorizontalAlignment.Left ) ;
  Lv1.Visible = true ;
  
  用循环把数据插入进ListView,用reader方法读取中括号中的字段名。
  lv1.Items.Clear(); //清空lv1中的记录
  ListViewItem li = new ListViewItem();
  li.SubItems.Clear(); //清空每行数据的每一列数据。
  foreach (DataRow reader in stu.Rows) //前提是stu有数据,stu是DataTable
  
  ListViewItem item = new ListViewItem((reader["EMP_NO"]).ToString());
  item.SubItems.Add(reader["NAME"].ToString());
  item.SubItems.Add(reader["ID"].ToString());
  this.lv1.Items.Add(item);
  
  接下来说说Listview中的一些小技巧。
  一、鼠标选中一行记录,如何读取那行记录中的某列记录??
  很简单用这句话:lv1.SelectedItems[0].SubItems[0].Text
  
  SelectedItems[0]指的是你选中的行,如果你选中的是多行,那么第一行中括号里就是0,第二行就是1,以此类推。
  SubItems[0] 指的是你选中的列,第一列中括号里就是0,第二行就是1,以此类推。
  
  二、Listview中双击记录事件。
  在 .cs 文件里写:
  private void lv1_DoubleClick(object sender, EventArgs e) //双击listview
  
  //这里写你想要产生的事件。例如:
  MessageBox.Show("OK");
  
  在 .Designer.cs 文件里找到相关的控件代码写入如下信息:
  this.lv1.DoubleClick += new System.EventHandler(this.lv1_DoubleClick);
  例如:
  // lv1
  //
  this.lv1.Location = new System.Drawing.Point(-3, 98);
  this.lv1.Name = "lv1";
  this.lv1.Size = new System.Drawing.Size(1018, 527);
  this.lv1.TabIndex = 28;
  this.lv1.UseCompatibleStateImageBehavior = false;
  this.lv1.View = System.Windows.Forms.View.Details;
  this.lv1.DoubleClick += new System.EventHandler(this.lv1_DoubleClick);
  三、Listview隐藏列
  有时候用Listview会遇到这样的麻烦。
  众所周知主键是区分每条不同记录最可靠的方法,一旦主键不显示在Listview中,那选中Listview某一行也就意味着在这一行中取不到这条记录的主键,只能取到其他显示的字段,那如何把这条记录传递给其他窗口呢?用其他字段?如果是这样的话就风险太大了,因为其他字段会有重复的可能,这样的程序就会出现BUG。
  这时候就该发挥隐藏列的作用了,隐藏列方便使用,其作用是在前台页面看不出有那条主键的字段,但是在代码控制中却包含了这个字段,我们点击某一条记录时就能方便的获取这条记录的主键字段,这样只要把这字段字符传到其他窗体就没问题了,因为主键字段是唯一且不能为空的。
  下面说说具体实现方法。
  Lv1.Columns.Add ( "A" , 60 , HorizontalAlignment.Right ) ;
  Lv1.Columns.Add ( "B" , 100 , HorizontalAlignment.Left ) ;
  Lv1.Columns.Add ( "C" , 100 , HorizontalAlignment.Left ) ;
  Lv1.Visible = true ;
  
  foreach (DataRow reader in stu.Rows) //前提是stu有数据,stu是DataTable
  
  ListViewItem item = new ListViewItem((reader["EMP_NO"]).ToString());
  item.SubItems.Add(reader["NAME"].ToString());
  item.SubItems.Add(reader["ID"].ToString());
  item.SubItems.Add(reader["PrimaryKey"].ToString());
  this.lv1.Items.Add(item);
  
  红色的是列的标题,白色的是循环输出每一行数据,这样可以很明显的看出,只有3列,却插入了4列的数据,而最后一列就是主键,而显示是也只有3列,那有人会问了,既然第四列没有显示,如何去第四列的数据呢?
  也是同样的代码:lv1.SelectedItems[0].SubItems[3].Text
  这个3显示的就是第四列的数据,因为计算机是从0开始计数的,很简单吧!
  namespace ListViewExercise
  
  public partial class Form1 : Form
  
  public Form1()
  
  InitializeComponent();
  ListViewSet();
  CreateViewItemMethodOne();
  //CreateViewItemMethodTow();
  
  /// ListView 设置
  private void ListViewSet()
  
  //ListView显示方式
  listViewControl.View = View.Details;
  
  /// //手动填加ListView方法1
  private void CreateViewItemMethodOne()
  
  listViewControl.BeginUpdate();
  #region 增加Item的标题,共有三个列
  //1、创建标题
  listViewControl.Columns.Add("文件名");
  listViewControl.Columns.Add("大小");
  listViewControl.Columns.Add("创建日期");
  #endregion
  #region 手动填加ListView方法
  //2、增加第一个Item,在View.Details模式下,有点像第一列中一个值
  listViewControl.Items.Add("folder1","文件夹1",0);
  //3、增加第一个Item的第一个SubItem,在View.Details模式下,有点像第一列中一个值
  listViewControl.Items["folder1"].SubItems.Add("11");
  //增加第一个Item的第二个SubItem,在View.Details模式下,有点像第一列中一个值
  listViewControl.Items["folder1"].SubItems.Add("20080114");

  listViewControl.Items.Add("folder2","文件夹2",0);
  listViewControl.Items["folder2"].SubItems.Add("21");
  listViewControl.Items["folder2"].SubItems.Add("20080115");

  listViewControl.Items.Add("文件夹3");
  listViewControl.Items.Add("文件夹4");

  #endregion

  listViewControl.EndUpdate();
  
  /// 手动填加ListView方法2
  private void CreateViewItemMethodTow()
  
  #region 增加Item的标题,共有三个列
  //1、创建标题,共三列
  listViewControl.Columns.Add("文件名");
  listViewControl.Columns.Add("大小");
  listViewControl.Columns.Add("创建日期");
  #endregion
  listViewControl.BeginUpdate();

  #region 增加第一个Item
  //2、定义一个ListViewItem,在View.Details模式下,有点像第一列中一个值
  ListViewItem lvItem;
  //3、定义ListViewSubItem,在View.Details模式下,有点像第二列中一个值
  ListViewItem.ListViewSubItem lvSubItem;

  //实列化一个Item,在View.Details模式下,有点像加第一行的第一个值
  lvItem = new ListViewItem();
  //Item的显示的文字
  lvItem.Text = "文件夹1";
  //4、Item增加到ListView控件中,即增加第一行。在View.Details模式下,有点像增加了第一个项目的第一列的第一个值
  listViewControl.Items.Add(lvItem);
  
  //实例化SubItem
  lvSubItem = new ListViewItem.ListViewSubItem();
  lvSubItem.Text = "10";
  //5、将SubItem增加到第一个Item中,在View.Details模式下,有点像增加了第一个项目的第二列的第一个值
  lvItem.SubItems.Add(lvSubItem);

  lvSubItem = new ListViewItem.ListViewSubItem();
  lvSubItem.Text = "20080114";
  //将SubItem增加到第一个Item中,在View.Details模式下,有点像增加了第一个项目的第三列的第一个值
  lvItem.SubItems.Add(lvSubItem);
  #endregion

  #region 增加第二个Item
  lvItem = new ListViewItem();
  lvItem.Text = "文件夹2";
  lvSubItem = new ListViewItem.ListViewSubItem();
  lvSubItem.Text = "20";
  lvItem.SubItems.Add(lvSubItem);
  lvSubItem = new ListViewItem.ListViewSubItem();
  lvSubItem.Text = "20080115";
  lvItem.SubItems.Add(lvSubItem);
  listViewControl.Items.Add(lvItem);
  #endregion

  listViewControl.EndUpdate();
  
  
  //第三种自己的方法,挺有效的,简单的
  private void CreateViewItems()
  
  listView1.BeginUpdate();
  listView1.Columns.Add("矩阵控制命令");
  listView1.Columns.Add("功能描述");
  listView1.Columns[0].Width=145;
  listView1.Columns[1].Width=515;
  listView1.Items.Add("/%Lock;");
  listView1.Items[0].SubItems.Add("锁定键盘");
  listView1.Items.Add("/%Unlock;");
  listView1.Items[1].SubItems.Add("解开键盘的锁定");
  listView1.Items.Add("/Version;");
  listView1.Items[2].SubItems.Add("查询软件版本");
  listView1.Items.Add("/:BellOff;");
  listView1.Items[3].SubItems.Add("关闭蜂鸣器");
  listView1.EndUpdate();
  
  
  

C#如何让listview可编辑 winform

listview的View属性是Details
如何让显示的数据可以直接编辑,就是双击数据,就可以编辑了
LabelEdit改成true后 好像只能修改第一列

thectrl.insertitem(0,
"张三");
第一个参数是索引即行数,写0就是插到第一行,第二个参数是内容
thectrl.setitemtext(0,
1,
"初三四班");
第一个参数同样是行索引,第二个参数是列索引,第三个不说了
首先使用thectrl.getitemcount();获得列表中的总行数。比如n=thectrl.getitemcount();
然后使用thectrl.insertitem(n,
"张三");新加一行,但新增的行只有第一列有数据,就是"张三",后面的列就可以用thectrl.setitemtext(n,
1,
"初二六班");的方法进行设置或修改了。
当然不用获得总行数,直接用thectrl.insertitem(0,
"张三");会把新行插到第一行的位置,类似于头插法,上面说的那个相当于尾插法。
参考技术A listview 是不可以编辑的。
DateGridView 是可以的。本回答被提问者采纳
参考技术B 好像不行的吧

以上是关于如何让C#中listview控件显示多行多列数据?的主要内容,如果未能解决你的问题,请参考以下文章

C# winform编程 开发环境VS2010 listview控件问题

C# listview如何复制选中的多行内容

C#如何让listview可编辑 winform

如何在 C#中的listView 控件中显示图片?

如何在 C#中的listView 控件中显示图片?

在C#中的Listview控件中,当鼠标悬浮在某列或者当选中某行时怎么显示图片??