背景:公司经常会需要将日志信息,输出到一个对话框中显示出来。之前一直采用的listbox控件,操作简单,使用方便,但是遗憾的是,不能自由控制每一行的状态。

 

于是想了如下几个方案:

(1)重绘listbox的OnDrawItem函数,这个难度比较大,一顿操作之后,发现实现不了,于是放弃

(2)给每个listbox添加DrawItem事件,这个比较简单,网上也有很多例子。但是针对每个listbox都需要添加相应的事件,操作麻烦且没有通用性。

(3)于是想到了第三个办法,也是最终实现的方法,换成ListView控件

具体实现过程

1.在ListView的默认状态下,输出一行数据,发现会自动换行,将LabelWrap设置为False即可解决

2.当然,选中的时候,我们也希望是一行数据,所以可以将FullRowSelect设置为True。

3.接下来就是尝试Listview控件的view属性了,需要自己不断的尝试,才能找到最好的结果

(1)LargeImage和SmallImage,看似可以正常使用,但是如果字体大小不一样的话,会将每一行数据自动排列(放弃)

(2)list,只有横向滚动条。放弃

(3)tile,不能增加横向滚动条,放弃

(4)最终只有detail有可能达到我们想要的目的

4.在detail下,第一次插入一行数据,会发现数据根本不显示,原因是因为在detail模式下,需要增加一列才可以显示。

5.然后会发现每次更改字体的大小什么的,标题栏也会随之改动,非常的难看,于是将HeaderStyle设置为None,即可将其隐藏起来。

6.因为ListviewItem的宽度固定,如果文字长度较长,会变成省略号,所以就需要计算当前文字的宽度。基本算法如下

Graphics g = Graphics.FromImage(new Bitmap(1, 1));
SizeF s = g.MeasureString(strMessage, font);

其中strMessage为输出的字符串,font为设置的字体,此方法需要用到GDI+的简单只是,因为需要new一个对象,所以建立一个小的即可。

7.关键算法如下

 1 ListViewItem lvi = new ListViewItem();
2
3 lvi.Font = font;
4 lvi.ForeColor = color;
5 lvi.Text = strMessage;
6
7 Graphics g = Graphics.FromImage(new Bitmap(1, 1));
8 SizeF s = g.MeasureString(strMessage, font);
9
10 if (s.Width > listView.Columns[0].Width)
11 {
12 listView.Columns[0].Width = (int)s.Width + 10;
13 }
14
15 listView.Invoke((EventHandler)(delegate
16 {
17 listView.Items.Insert(0, lvi);
18
19 listView.Font = lvi.Font;
20
21
22
23 int nCount = listView.Items.Count;
24 if (nCount >= 50)
25 {
26 listView.Items.RemoveAt(nCount - 1);
27 }
28 }));

8.最终的实现结果如下:

    

C# winfrom ListView控件实现自由设置每一行字体及背景色等的更多相关文章

  1. C#如何解决对ListView控件更新以及更新时界面闪烁问题

    第一个问题:如何更新ListView控件内容 很多时候运行窗体程序时,由于程序中使用了多线程加之操作不当,所以在对控件操作时会出现下面这样的异常:   这是因为我们在窗体中添加的控件都有属于自己的线程 ...

  2. winform利用ImageList控件和ListView控件组合制作图片文件浏览器

    winform利用ImageList控件和ListView控件组合制作图片文件浏览器,见图,比较简单,实现LISTVIEW显示文件夹图片功能. 1.选择文件夹功能代码: folderBrowserDi ...

  3. WinFrom 公共控件 Listview 的使用

    Listview绑定数据库数据展示与操作使用  1.拖一个Listview控件到项目中先将视图改为Details 2.编辑列 设置列头  添加columnHeader成员 Text 是显示的名称 3. ...

  4. WPF ListView控件设置奇偶行背景色交替变换以及ListViewItem鼠标悬停动画

    原文:WPF ListView控件设置奇偶行背景色交替变换以及ListViewItem鼠标悬停动画 利用WPF的ListView控件实现类似于Winform中DataGrid行背景色交替变换的效果,同 ...

  5. ListView控件--2016年12月9日

    ListView属性 ListView   名称 说明 AccessKey 重写 WebControl.AccessKey 属性. 不支持将此属性设置 ListView 控件.(覆盖 WebContr ...

  6. ListView控件

      打气筒工具:将R.layout.item_listview布局添加到相应的view控件里面 View view=LayoutInflater.from(ScondPro.this).inflate ...

  7. Android中ListView控件的使用

    Android中ListView控件的使用 ListView展示数据的原理 在Android中,其实ListView就相当于web中的jsp,Adapter是适配器,它就相当于web中的Servlet ...

  8. winform listview控件

    ListView控件 1.常用的基本属性: (1)FullRowSelect:设置是否行选择模式.(默认为false) 提示:只有在Details视图该属性才有意义. (2) GridLines:设置 ...

  9. 《ASP.NET1200例》ListView 控件与DataPager控件的结合<二>

    ASP.NET使用ListView数据绑定控件和DataPager实现数据分页显示 为什么使用ListView+DataPager的方式实现分页显示? .net提供的诸多数据绑定控件,每一种都有它自己 ...

随机推荐

  1. 开源流程引擎camunda如何扩展

    ​  市场上基于Java语言的开源工作流引擎有:osworkflow.jbpm.activiti.flowable.camunda等,其中osworkflow.jbpm流程引擎已经过时,目前主流的开源 ...

  2. 使用 DartPad 制作代码实践教程

    DartPad 是一个开源的.在浏览器中体验和运行 Dart 编程语言的线上编辑器,目标是为了帮助开发者更好地了解 Dart 编程语言以及 Flutter 应用开发. DartPad 项目起始于 20 ...

  3. BUUCTF-菜刀666

    菜刀666 这题和之前做过的流量题不同,对我还是有些难度.看了看大佬的wp才做出来的 wireshark打开流量包,一开始只是单纯过滤http,包很多,看花了眼,看了好多也没觉得有啥异常. 后面才知道 ...

  4. React技巧之表单提交获取input值

    正文从这开始~ 总览 在React中,通过表单提交获得input的值: 在state变量中存储输入控件的值. 在form表单上设置onSubmit属性. 在handleSubmit函数中访问输入控件的 ...

  5. 使用强大的DBPack处理分布式事务(PHP使用教程)

    主流的分布式事务的处理方案 近些年,随着微服务的广泛使用,业务对系统的分布式事务处理能力的要求越来越高. 早期的基于XA协议的二阶段提交方案,将分布式事务的处理放在数据库驱动层,实现了对业务的无侵入, ...

  6. 8.4 苹果macOS电脑如何安装Java开发环境(JDK)

    和Windows电脑安装差不多. 下载 来到JDK官方下载界面,点击Java SE 8(简称JDK 8)后面的JDK下载,来到该界面,先同意协议,然后下载对应平台的JDK,我们这里下载Mac OS X ...

  7. 最著名的著名的比特币BTC钱包地址-中本聪的钱包

    最著名的著名的比特币BTC钱包地址-中本聪的钱包1.比特币创始人中本聪 1PTFYUG6nCzRrByoRfGT5kefUNuZjNF84o这个地址还是比特币的创世地址,比特币从未移动过,其中的50币 ...

  8. JavaScript进阶知识点——函数和对象详解

    JavaScript进阶知识点--函数和对象详解 我们在上期内容中学习了JavaScript的基本知识点,今天让我们更加深入地了解JavaScript JavaScript函数 JavaScript函 ...

  9. hive SQL 初学者题目,实战题目 字符串函数,日期拼接,开窗函数。。。。

    sql:Hive实现按照指定格式输出每七天的消费平均数输出格式:2018-06-01~2018-06-07 12.29...2018-08-10~2018-08-16 80.67 答案:-- 1.先将 ...

  10. mybatis-plus详解

    旧的代码生成 记得导包,依赖如下 <!-- mybatis-plus --> <dependency> <groupId>com.baomidou</grou ...