ListView列表视图控件

ListView列表视图控件通常用于显示数据,用户可以对这些数据和显示方式进行某些控制。还可以把包含在控件中的数据显示为列和行(像网格一样),或者显示为一列,或者显示为图标表示。

其实列表视图控件的作用,就像我们平时浏览windows文件夹一样,可以以“列表”、“平铺”、“详细信息”、“大图标”等方式显示某一目录下的文件夹和文件。

1. ListView控件的属性

Activation

使用这个属性,可以控制用户在列表视图中激活选项的方式,可能的值如下:

Standard:这个设置是用户为自己的计算机选择的值;

OneClick:单击一个选项,激活它;

TwoClick:双击一个选项,激活它。

Alignment

这个属性可以控制列表视图中选项的对齐方式,有4个可能的值:

Default:如果用户拖放一个选项,它将仍位于拖动前的位置;

Left:选项与ListView控件的左边界对齐;

Top:选项与ListView控件的顶边界对齐;

SnapToGridListView控件包含一个不可见的网格,选项都放在该网格中。

AllowColumnReorder

如果把这个属性设为true,就允许用户改变列表视图中列的顺序。

AutoArrange

如果把这个属性设置为true,选项会自动根据Alignment属性排序。如果用户把一个选项拖放到列表视图的中央,且AlignmentLeft,则选项会自动左对齐。只有在View属性是LargeIconSmallIcon时,这个属性才有意义。

CheckBoxes

如果把这个属性设置为true,列表视图中的每个选项会在其左边显示一个复选框。只有在View属性是DetailList时,这个属性才有意义。

CheckedIndices

CheckedItems

这两个属性可以分别访问索引和选项的集合,该集合包含列表中被选中的选项。

Columns

列表视图可以包含列。通过这个属性可以访问列集合,通过该集合,可以增加或删除列。

FocusedItem

这个属性包含列表视图中有焦点的选项。如果没有选择任何选项,该属性就为null

FullRowSelect

这个属性为true时,单击一个选项,该选项所在的整行文本都会突出显示。如果该属性为false,则只选项本身会突出显示。

GridLines

把这个属性设置为true,则列表视图会在行和列之间绘制网格线。只有View属性为Details时,这个属性才有意义。

HeaderStyle

可以控制列标题的显示方法,有3中样式:

Clickable:列标题显示为一个按钮;

NonClickable:列标题不响应鼠标单击事件;

None:不显示列标题。

HoverSelection

这个属性为true时,用户可以把鼠标指针放在列表视图的一个选项上,以选择它。

Items

列表视图中的选项集合。

LabelEdit

这个属性设置为true时,用户可以在Details视图下编辑第一列的内容。

LabelWrap

这个属性设置为true时,标签就会自动换行,以便显示所有文本。

LargeImageList

这个属性包含ImageList,而ImageList包含大图像。这些图像可以在View属性为LargeIcon时使用。

MultiSelect

这个属性设置为true时,用户可以选择多个选项。

Scrollable

这个属性设置为true时,就显示滚动条。

SelectedIndices

SelectedItems

这两个属性分别包含选中索引和选项的集合。

SmallImageList

View属性为SmallIcon时,这个属性包含了ImageList,其中ImageList包含了要使用的图像。

Sorting

可以让列表视图对它包含的选项排序,有3中模式:AscendingDescendingNone

StateImageList

ImageList包含图像的蒙版,这些图像蒙版可用作LargeImageListSmallImageList图像的覆盖图,表示定制的状态

TopItem

返回列表视图顶部的选项

View

列表视图可以用4种不同的基本模式显示其选项:

LargeIcon:所有选项都在其旁边显示一个大图标(32*32)和一个标签;

SmallIcon:所有选项都在其旁边显示一个大图标(16*16)和一个标签;

List:只显示一列,该列可以包含一个图标和一个标签;

Details:可以显示任意数量的列,只有第一列可以包含图标;

Tile:显示一个大图标和一个标签,在图标的右边显示子项信息;


2. ListView控件的方法

方法

说明

BeginUpdate()

调用这个方法,将告诉列表视图开始更新,直到调用EndUpdate()为止。当一次插入多个选项时,使用这个方法很有用,因为它会禁止视图,大大提高速度。

Clear()

彻底清除列表视图,删除所有的选项和列。

EndUpdate()

在调用BeginUpdate()之后调用这个方法,在调用这个方法时,列表视图会显示其所有选项。

EnsureVisible()

在调用这个方法时,列表视图会滚动,以显示指定索引的选项

GetItemAt()

返回列表视图中位于x,y位置的选项


3. ListView控件的事件

事件

说明

AfterLabelEdit

在编辑了标签后,引发该事件

BeforeLabelEdit

在用户开始编辑标签前,引发该事件

ColumnClick

在单击一个列时,引发该事件

ItemActivate

在激活一个选项时,引发该事件


4. ListViewItem

列表视图中的选项总是ListViewItem类的一个实例。ListViewItem包含要显示的信息,如文本和图标的索引。ListViewItem对象有一个SubItems属性,包含ListViewSubItem类的实例。ListView控件处于DetailsTile模式下,这些子选项就会显示出来。子选项和主选项之间的区别是子选项不能显示图标。


5. ColumnHeader

要使列表视图显示列标题,需要把类ColumnHeader的实例添加到ListViewColumns集合中。


6.ImageList控件

ImageList图像列表控件提供了一个集合,可以用于存储在窗体的其他控件中使用的图像。可以在图像列表中存储任意大小的图像,但同一个图像列表控件中的每个图像的大小必须相同。对于ListView,则需要两个ImageList控件,显示大图像和小图像。

ImageList图像列表控件位于“工具箱”中“组件”类别。


7.示例

以下示例代码是以ListView控件显示C盘目录下的文件夹和文件,支持“List”、“Details”等多种方式的切换,支持访问下层目录和返回上一级目录。初始显示方式是以“Details”详细信息的方式显示,包含“Filename”、“size”和“Last accessed”三个列标题。

using System.IO;

namespace Ch15Ex01
{
    public partial class Form1 : Form
    {
        private System.Collections.Specialized.StringCollection folderCol;

        //创建列标题,并添加到列表视图控件中
        private void CreateHeadersAndFillListView()
        {
            ColumnHeader colHead;

            //添加“Filename”列标题
            colHead      = new ColumnHeader();
            colHead.Text = "Filename";
            ListViewFileAndFloder.Columns.Add(colHead);

            //添加“Size”列标题
            colHead      = new ColumnHeader();
            colHead.Text = "Size";
            ListViewFileAndFloder.Columns.Add(colHead);

            //添加“Last accessed”列标题
            colHead      = new ColumnHeader();
            colHead.Text = "Last accessed";
            ListViewFileAndFloder.Columns.Add(colHead);
        }

        private void PaintListView(string root)
        {
            try
            {
                ListViewItem lvi;
                ListViewItem.ListViewSubItem lvsi;

                if (string.IsNullOrEmpty(root)) return;

                //当前目录
                DirectoryInfo dir = new DirectoryInfo(root);

                //当前目录的所有子目录,即文件夹
                DirectoryInfo[] dirs = dir.GetDirectories();

                //当前目录下的文件
                FileInfo[] files = dir.GetFiles(); 

                //清空
                ListViewFileAndFloder.Items.Clear();

                ListViewFileAndFloder.BeginUpdate();

                //遍历所有文件夹
                foreach (DirectoryInfo di in dirs)
                {
                    lvi = new ListViewItem();
                    lvi.Text = di.Name;     //保存文件夹名
                    lvi.ImageIndex = 0;     //索引为0
                    lvi.Tag = di.FullName;  //保存文件夹完全路径

                    //如果是文件夹则忽略文件夹的大小
                    lvsi = new ListViewItem.ListViewSubItem();
                    lvsi.Text = "";           
                    lvi.SubItems.Add(lvsi);

                    //最后访问时间
                    lvsi = new ListViewItem.ListViewSubItem();
                    lvsi.Text = di.LastAccessTime.ToString();  
                    lvi.SubItems.Add(lvsi);

                    //添加到Items集合中
                    ListViewFileAndFloder.Items.Add(lvi); 
                }

                foreach (FileInfo fi in files)
                {
                    lvi = new ListViewItem();

                    lvi.Text = fi.Name;    //保存文件名
                    lvi.ImageIndex = 1;    //索引为0
                    lvi.Tag = fi.FullName; //保存文件完全路径

                    //获得文件大小
                    lvsi = new ListViewItem.ListViewSubItem();
                    lvsi.Text = fi.Length.ToString();
                    lvi.SubItems.Add(lvsi);

                    //最后访问时间
                    lvsi = new ListViewItem.ListViewSubItem();
                    lvsi.Text = fi.LastAccessTime.ToString();     
                    lvi.SubItems.Add(lvsi);

                    //添加到Items集合中
                    ListViewFileAndFloder.Items.Add(lvi);
                }

                ListViewFileAndFloder.EndUpdate();
            }
            catch (System.Exception err)
            {
                MessageBox.Show("Error:"+ err.Message);
            }

        }

        public Form1()
        {
            InitializeComponent();

            folderCol = new System.Collections.Specialized.StringCollection();

            //为列表视图控件创建列标题
            CreateHeadersAndFillListView();

            //绘制C盘目录下的文件夹和文件
            PaintListView(@"C:\");

            //添加C盘搜索目录
            folderCol.Add(@"C:\");
        }

        //列表视图控件的显示模式切换为大图标模式
        private void radioButton1_CheckedChanged(object sender, EventArgs e)
        {
            RadioButton rdb = (RadioButton)sender;

            if (rdb.Checked)
            {
                ListViewFileAndFloder.View = View.LargeIcon;
            }
        }

        //列表视图控件的显示模式切换为小图标模式
        private void radioButton2_CheckedChanged(object sender, EventArgs e)
        {
            RadioButton rdb = (RadioButton)sender;

            if (rdb.Checked)
            {
                ListViewFileAndFloder.View = View.SmallIcon;
            }
        }

        //列表视图控件的显示模式切换为列表模式
        private void radioButton3_CheckedChanged(object sender, EventArgs e)
        {
            RadioButton rdb = (RadioButton)sender;

            if (rdb.Checked)
            {
                ListViewFileAndFloder.View = View.List;
            }
        }

        //列表视图控件的显示模式切换为详细信息模式
        private void radioButton4_CheckedChanged(object sender, EventArgs e)
        {
            RadioButton rdb = (RadioButton)sender;

            if (rdb.Checked)
            {
                ListViewFileAndFloder.View = View.Details;
            }
        }

        //列表视图控件的显示模式切换为平铺模式
        private void radioButton5_CheckedChanged(object sender, EventArgs e)
        {
            RadioButton rdb = (RadioButton)sender;

            if (rdb.Checked)
            {
                ListViewFileAndFloder.View = View.Tile;
            }
        }

        //点击“back”按钮,返回上级目录
        //其原理是确保folderCol集合中最后一个选项始终为当前目录的完整路径
        private void buttonBack_Click(object sender, EventArgs e)
        {
            if (folderCol.Count > 1)
            {
                PaintListView(folderCol[folderCol.Count - 2].ToString());
                folderCol.RemoveAt(folderCol.Count - 1);
            }
            else
            {
                PaintListView(folderCol[0].ToString());
            }
 
        }

        //双击控件中的每一文件夹或文件继续访问
        private void ListViewFileAndFloder_ItemActivate(object sender, EventArgs e)
        {
            ListView lw = (ListView)sender;
            string filename = lw.SelectedItems[0].Tag.ToString();

            if (lw.SelectedItems[0].ImageIndex != 0)
            {
                try
                {
                    //打开文件
                    System.Diagnostics.Process.Start(filename);
                }
                catch
                {
                    return;
                }
            }
            else
            {
                PaintListView(filename);
                folderCol.Add(filename);
            }
        }
    }
}

其初始显示结果如下图所示:

将显示模式切换为“Title”,显示如下:


其中文件夹和文件图标是外部导入的ico图标,保存在ImageList控件中。



  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt QML 提供了一个名为 ListView 的组件,可以用于显示列表视图,支持下拉刷新、上拉分页和滚动轴。 以下是一个简单的 ListView 示例: ``` import QtQuick 2.0 import QtQuick.Controls 2.0 ApplicationWindow { visible: true width: 400 height: 600 title: "ListView Example" ListView { id: listView anchors.fill: parent // 设置模型数据 model: ListModel { ListElement { name: "Item 1" } ListElement { name: "Item 2" } ListElement { name: "Item 3" } ListElement { name: "Item 4" } ListElement { name: "Item 5" } ListElement { name: "Item 6" } ListElement { name: "Item 7" } ListElement { name: "Item 8" } ListElement { name: "Item 9" } ListElement { name: "Item 10" } } // 设置每个项的属性 delegate: Rectangle { width: listView.width height: 50 color: index % 2 == 0 ? "#f2f2f2" : "#ffffff" Text { text: name anchors.centerIn: parent } } // 下拉刷新 onRefreshRequested: { console.log("下拉刷新") } // 上拉分页 onEndReached: { console.log("上拉分页") } // 滚动轴 ScrollBar.vertical: ScrollBar {} } } ``` 上面的示例中,ListView 的 model 属性设置了一个 ListModel,用于存储模型数据。delegate 属性则定义了每个项的属性,包括宽度、高度、颜色和文本。 在 ListView 中可以通过 onRefreshRequested 和 onEndReached 信号来实现下拉刷新和上拉分页功能。当用户下拉列表视图时,会触发 onRefreshRequested 信号;当滚动到列表视图底部时,会触发 onEndReached 信号。 最后,为了实现滚动轴,我们可以在 ListView 中添加 ScrollBar 组件,设置其 vertical 属性为 true 即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值