关键点:(1)TreeList中显示的单元格默认不显示上、下、左、右边框,显示的是TreeList自身的行横边框、列纵边框,具体对应TreeList属性中OptionView项下的ShowVertLines、ShowHorzLines两项,将其对应默认值由默认False改为True即可去除行横边框、列纵边框,然后设置怎样的单元格格式显示什么样的单元格格式;

    (2)在*_CustomDrawNodeCell中修改函数,而不是*_NodeCellStyle中修改,另外需要注意,前者在后者前运行,因此后者中的修改会覆盖掉前者中的修改。

    (3)绘制TreeList单元格网线时,自动会覆盖掉单元格的所有边框,这与WinForm中只需绘制右、下,不需要绘制左上边框不同。

  

    (4)如果只想汇总Treelist单元格边框,则不需要设置e.Hander = true;而如果想重绘单元格值或填充颜色则必须设置e.Hander = true;并且其值域不同,重绘的区域不同,即可以针对性重绘。

效果图如下:

举例:

(1)具体实现相关代码如下:

 

        private void tlPublic_CustomDrawNodeCell(object sender, DevExpress.XtraTreeList.CustomDrawNodeCellEventArgs e)
{
DataRow dr = e.Node.Tag as DataRow;
if (dr != null)
{
Brush grid = new SolidBrush(Color.LightGray);//Color.Gray
Pen gridPen = new Pen(grid); if (dr["PublicId"].ToString() == "-2")
{
//e.Appearance.ForeColor = TrueLore.PBTool.BaseUI.DataGridViewComponent.GridViewSumRowFontColor;
e.Appearance.Font = new Font(this.Font, FontStyle.Bold);
}
else if (e.Node.HasChildren)
{
Color parentCellBackColor = TrueLore.PBTool.BaseUI.DataGridViewComponent.TreeGridViewBidFileRowBackColor;
e.Cache.FillRectangle(parentCellBackColor,e.Bounds);
////绘制值
e.Graphics.DrawLine(gridPen, e.Bounds.X, e.Bounds.Y, e.Bounds.X + e.Bounds.Width, e.Bounds.Y);
e.Graphics.DrawLine(gridPen, e.Bounds.X, e.Bounds.Y + e.Bounds.Height, e.Bounds.X + e.Bounds.Width, e.Bounds.Y + e.Bounds.Height);
}
else
{
#region TreeList实现类似单元格合并的效果
//现在属性中OptionView项下将ShowHorzlines设置为True
//当绘制TreeList单元格时会覆盖掉单元格的上下左右边框,因为TreeList的列纵线被设置为显示,行横线被设置为不显示,所以只需绘制上下线即可。 bool isMergeCell = false;
string cellCaption = string.Empty;
foreach (string caption in colsHeaderText_H)
{
if (this.tlPublic.Columns[e.Column.AbsoluteIndex].Caption == caption)
{
isMergeCell = true;
cellCaption = caption;
break;
}
}
//纵向合并
if (isMergeCell == true) //this.tlPublic.Columns[e.Column.AbsoluteIndex].Caption == caption) //&& e.Node.NextNode != null
{
Brush cellBackBrush = new System.Drawing.SolidBrush(e.Appearance.BackColor);
if (e.Node.NextNode == null)
{
//下边缘的线
e.Graphics.DrawLine(gridPen, e.Bounds.X, e.Bounds.Y + e.Bounds.Height, e.Bounds.X + e.Bounds.Width, e.Bounds.Y + e.Bounds.Height);
}
else if (e.Node.GetDisplayText(e.Column.AbsoluteIndex) != e.Node.NextNode.GetDisplayText(e.Column.AbsoluteIndex))
{
//下边缘的线
e.Graphics.DrawLine(gridPen, e.Bounds.X, e.Bounds.Y + e.Bounds.Height, e.Bounds.X + e.Bounds.Width, e.Bounds.Y + e.Bounds.Height);
}
else
{
e.Graphics.FillRectangle(cellBackBrush, e.Bounds);
e.Handled = true; //显示重绘(放置位置即值域不同,显示重绘的区域不同)
}
//首子节点绘制上边框,之所以放在代码最后是因为放在前面可能在单元格填充时覆盖掉
if (e.Node == e.Node.ParentNode.FirstNode)
{
e.Graphics.DrawLine(gridPen, e.Bounds.X, e.Bounds.Y, e.Bounds.X + e.Bounds.Width, e.Bounds.Y);
}
}
//非合并列
else
{
//当绘制TreeList单元格时会覆盖掉单元格的上下左右边框,因为TreeList的列纵线被设置为显示,行横线被设置为不显示,所以只需绘制上下线即可。
e.Graphics.DrawLine(gridPen, e.Bounds.X, e.Bounds.Y, e.Bounds.X + e.Bounds.Width, e.Bounds.Y);
e.Graphics.DrawLine(gridPen, e.Bounds.X, e.Bounds.Y + e.Bounds.Height, e.Bounds.X + e.Bounds.Width, e.Bounds.Y + e.Bounds.Height);
}
#endregion
}
} }

多加代码:

(2)具体实现相关代码如下:

        //需要(行、列)合并的所有列标题名
List<String> colsHeaderText_H = new List<String>(); private void InitFormatColumns()
{
colsHeaderText_H.Add("量化合计");
colsHeaderText_H.Add("投标报价");
colsHeaderText_H.Add("评标价");
} private void tlPublic_CustomDrawNodeCell(object sender, DevExpress.XtraTreeList.CustomDrawNodeCellEventArgs e)
{
DataRow dr = e.Node.Tag as DataRow;
if (dr != null)
{
Brush gridBrush = new SolidBrush(Color.Pink);
Brush grid = new SolidBrush(Color.Gray);
Pen gridPen = new Pen(grid); ////e.Graphics.FillRectangle(gridBrush, e.Bounds);
//e.Cache.DrawRectangle(gridPen, e.Bounds);
//下边缘的线
//e.Graphics.DrawLine(gridPen, e.Bounds.X, e.Bounds.Y + e.Bounds.Height, e.Bounds.X + e.Bounds.Width, e.Bounds.Y + e.Bounds.Height);
////绘制值
//e.Graphics.DrawString(e.Node.GetDisplayText(e.Column.AbsoluteIndex), e.Appearance.Font,
// Brushes.Crimson, e.Bounds.X + 2, e.Bounds.Y + 2, StringFormat.GenericDefault); if (dr["PublicId"].ToString() == "-2")
{
e.Appearance.ForeColor = TrueLore.PBTool.BaseUI.DataGridViewComponent.GridViewSumRowFontColor;
e.Appearance.Font = new Font(this.Font, FontStyle.Bold); //e.Graphics.FillRectangle(gridBrush, e.Bounds);
//e.Cache.DrawRectangle(gridPen,e.Bounds);
//下边缘的线
//e.Graphics.DrawLine(gridPen, e.Bounds.X, e.Bounds.Y + e.Bounds.Height, e.Bounds.X + e.Bounds.Width, e.Bounds.Y + e.Bounds.Height); ////绘制值
//e.Graphics.DrawString(e.Node.GetDisplayText(e.Column.AbsoluteIndex), e.Appearance.Font,
// Brushes.Crimson, e.Bounds.X + 2, e.Bounds.Y + 2, StringFormat.GenericDefault);
}
else if (e.Node.HasChildren)
{
//e.Appearance.BackColor = TrueLore.PBTool.BaseUI.DataGridViewComponent.TreeGridViewParentRowBackColor;
Color parentCellBackColor = TrueLore.PBTool.BaseUI.DataGridViewComponent.TreeGridViewParentRowBackColor;
//e.Cache.DrawRectangle(gridPen, e.Bounds);
e.Cache.FillRectangle(parentCellBackColor,e.Bounds);
////绘制值
e.Graphics.DrawString(e.Node.GetDisplayText(e.Column.AbsoluteIndex), e.Appearance.Font,
Brushes.Crimson, e.Bounds.X + 2, e.Bounds.Y + 2, StringFormat.GenericDefault);//下边缘的线
e.Graphics.DrawLine(gridPen, e.Bounds.X, e.Bounds.Y + e.Bounds.Height, e.Bounds.X + e.Bounds.Width, e.Bounds.Y + e.Bounds.Height); //e.Handled = true; }
else
{
#region 注释代码
//string tmpCaption = e.Column.Caption;
//if ("量化合计" == tmpCaption || "投标报价" == tmpCaption || "评标价" == tmpCaption)
//{
// e.Appearance.BorderColor = e.Appearance.BackColor;
// e.Handled = true;
//}
//e.Node.TreeList.RefreshCell(e.Node, e.Column);
//e.Cache.DrawRectangle();
#endregion #region TreeList实现类似单元格合并的效果
//现在属性中OptionView项下将ShowHorzlines设置为True
//当绘制TreeList单元格时会覆盖掉单元格的上下左右边框,因为TreeList的列纵线被设置为显示,行横线被设置为不显示,所以只需绘制上下线即可。 bool isMergeCell = false;
string cellCaption = string.Empty;
foreach (string caption in colsHeaderText_H)
{
if (this.tlPublic.Columns[e.Column.AbsoluteIndex].Caption == caption)
{
isMergeCell = true;
cellCaption = caption;
break;
}
}
//纵向合并
if (isMergeCell == true) //this.tlPublic.Columns[e.Column.AbsoluteIndex].Caption == caption) //&& e.Node.NextNode != null
{
Brush cellBackBrush = new System.Drawing.SolidBrush(e.Appearance.BackColor); //若与下一单元格值不同
//if (e.CellValue.ToString() != e.Node.NextNode.GetDisplayText(e.Column.AbsoluteIndex))
if (e.Node.NextNode == null)
{
//e.Cache.DrawRectangle(gridPen, e.Bounds);
e.Graphics.FillRectangle(cellBackBrush, e.Bounds);
//e.Appearance.FillRectangle(e.Cache, e.Bounds);
//下边缘的线
e.Graphics.DrawLine(gridPen, e.Bounds.X, e.Bounds.Y + e.Bounds.Height, e.Bounds.X + e.Bounds.Width, e.Bounds.Y + e.Bounds.Height);
//绘制值
e.Graphics.DrawString(e.Node.GetDisplayText(e.Column.AbsoluteIndex), e.Appearance.Font,
Brushes.Crimson, e.Bounds.X + 2, e.Bounds.Y + 2, StringFormat.GenericDefault);
}
else if (e.Node.GetDisplayText(e.Column.AbsoluteIndex) != e.Node.NextNode.GetDisplayText(e.Column.AbsoluteIndex))
{
//e.Cache.DrawRectangle(gridPen, e.Bounds);
e.Graphics.FillRectangle(cellBackBrush, e.Bounds);
//e.Appearance.FillRectangle(e.Cache, e.Bounds);
//下边缘的线
//e.Graphics.DrawLine(gridPen, e.Bounds.Left, e.Bounds.Bottom - 1, e.Bounds.Right, e.Bounds.Bottom);
//e.Graphics.DrawLine(gridPen, e.Bounds.X, e.Bounds.Y + e.Bounds.Height, e.Bounds.X + e.Bounds.Width, e.Bounds.Y + e.Bounds.Height);
//绘制值
e.Graphics.DrawString(e.Node.GetDisplayText(e.Column.AbsoluteIndex), e.Appearance.Font,
Brushes.Crimson, e.Bounds.X + 2, e.Bounds.Y + 2, StringFormat.GenericDefault);
}
else
{
//e.Graphics.DrawLine(gridPen, e.Bounds.X, e.Bounds.Y + e.Bounds.Height, e.Bounds.X + e.Bounds.Width, e.Bounds.Y + e.Bounds.Height);
//e.Appearance.FillRectangle(e.Cache, e.Bounds);
e.Graphics.FillRectangle(cellBackBrush, e.Bounds);
} //break;
}
//非合并列
else
{
//e.Cache.DrawRectangle(gridPen, e.Bounds);
//当绘制TreeList单元格时会覆盖掉单元格的上下左右边框,因为TreeList的列纵线被设置为显示,行横线被设置为不显示,所以只需绘制上下线即可。
e.Graphics.DrawLine(gridPen, e.Bounds.X, e.Bounds.Y, e.Bounds.X + e.Bounds.Width, e.Bounds.Y);
//绘制值
e.Graphics.DrawString(e.Node.GetDisplayText(e.Column.AbsoluteIndex), e.Appearance.Font,
Brushes.Crimson, e.Bounds.X + 2, e.Bounds.Y + 2, StringFormat.GenericDefault);
//e.Handled = true;
////下边缘的线
e.Graphics.DrawLine(gridPen, e.Bounds.X, e.Bounds.Y + e.Bounds.Height, e.Bounds.X + e.Bounds.Width, e.Bounds.Y + e.Bounds.Height); } ////设置处理事件完成(关键点),只有设置为ture,才能显示出想要的结果。
//e.Handled = true;
#endregion //}
} //设置处理事件完成(关键点),只有设置为ture,才能显示出想要的结果。
e.Handled = true; } }
#endregion private void tlPublic_NodeCellStyle(object sender, DevExpress.XtraTreeList.GetCustomNodeCellStyleEventArgs e)
{
//string tmpCaption = e.Column.Caption;
//if ("量化合计" == tmpCaption || "投标报价" == tmpCaption || "评标价" == tmpCaption)
//{
// e.Appearance.BorderColor = e.Appearance.BackColor;
// e.Appearance.ForeColor = Color.Red;
// e.Node.TreeList.OptionsView.ShowFocusedFrame = false;
//e.Column.AppearanceCell.Options.UseBorderColor = true;
//e.Column.AppearanceCell.BorderColor = Color.DeepPink;
//}
//e.Appearance.BackColor = TrueLore.PBTool.BaseUI.DataGridViewComponent.TreeGridViewParentRowBackColor;
}

(3)不想覆盖已有单元格内容(选择性覆盖):首选将数节点的纵向边框去掉,再则添加事件及代码如下:

        private void tlcBidEvalationPrice_CustomDrawNodeCell(object sender, DevExpress.XtraTreeList.CustomDrawNodeCellEventArgs e)
{
if (e.Node == null)
{
return;
} DataRow dr = e.Node.Tag as DataRow; if (dr != null)
{
Brush grid = new SolidBrush(Color.LightGray); //Color.Gray
Pen gridPen = new Pen(grid);
if (dr["PublicId"].ToString() == "-1")
{
Color parentCellBackColor = TrueLore.PBTool.BaseUI.DataGridViewComponent.TreeGridViewBidFileRowBackColor;
e.Cache.FillRectangle(parentCellBackColor, e.Bounds);
e.Graphics.DrawLine(gridPen, e.Bounds.X, e.Bounds.Y, e.Bounds.X + e.Bounds.Width, e.Bounds.Y); e.Graphics.DrawLine(gridPen, e.Bounds.X, e.Bounds.Y + e.Bounds.Height, e.Bounds.X + e.Bounds.Width, e.Bounds.Y + e.Bounds.Height);
}
else if (dr["PublicId"].ToString() == "-2")
{
//Color sumRowBackColor = TrueLore.PBTool.BaseUI.DataGridViewComponent.GridViewSumRowBackColor;
//e.Cache.FillRectangle(sumRowBackColor, e.Bounds);
//当绘制TreeList单元格时会覆盖掉单元格的上下左右边框,因为TreeList的列纵线被设置为显示,行横线被设置为不显示,所以只需绘制上下线即可。
e.Graphics.DrawLine(gridPen, e.Bounds.X, e.Bounds.Y, e.Bounds.X + e.Bounds.Width, e.Bounds.Y); //下边缘的线
e.Graphics.DrawLine(gridPen, e.Bounds.X, e.Bounds.Y + e.Bounds.Height, e.Bounds.X + e.Bounds.Width, e.Bounds.Y + e.Bounds.Height);
}
else
{
#region TreeList实现类似单元格合并的效果
//现在属性中OptionView项下将ShowHorzlines设置为True
//当绘制TreeList单元格时会覆盖掉单元格的上下左右边框,因为TreeList的列纵线被设置为显示,行横线被设置为不显示,所以只需绘制上下线即可。 bool isMergeCell = false;
string cellCaption = string.Empty;
foreach (string caption in colsHeaderText_H)
{
if (this.tlcBidEvalationPrice.Columns[e.Column.AbsoluteIndex].Caption == caption)
{
isMergeCell = true;
cellCaption = caption;
break;
}
}
//纵向合并
if (isMergeCell == true)
{
Brush cellBackBrush = new System.Drawing.SolidBrush(e.Appearance.BackColor); //若与下一单元格值不同
if (e.Node.NextNode == null )//|| e.Node.NextNode.NextNode == null
{
e.Graphics.FillRectangle(cellBackBrush, e.Bounds);
//当绘制TreeList单元格时会覆盖掉单元格的上下左右边框,因为TreeList的列纵线被设置为显示,行横线被设置为不显示,所以只需绘制上下线即可。
e.Graphics.DrawLine(gridPen, e.Bounds.X, e.Bounds.Y, e.Bounds.X + e.Bounds.Width, e.Bounds.Y);
//下边缘的线
e.Graphics.DrawLine(gridPen, e.Bounds.X, e.Bounds.Y + e.Bounds.Height, e.Bounds.X + e.Bounds.Width, e.Bounds.Y + e.Bounds.Height);
//绘制值
e.Graphics.DrawString(e.Node.GetDisplayText(e.Column.AbsoluteIndex), e.Appearance.Font,
Brushes.Black, e.Bounds.X, e.Bounds.Y, StringFormat.GenericTypographic);
}
else if (e.Node.GetDisplayText(e.Column.AbsoluteIndex) != e.Node.NextNode.GetDisplayText(e.Column.AbsoluteIndex))
{
e.Graphics.FillRectangle(cellBackBrush, e.Bounds);
}
else
{
e.Graphics.FillRectangle(cellBackBrush, e.Bounds);
}
}
//非合并列
else
{
//当绘制TreeList单元格时会覆盖掉单元格的上下左右边框,因为TreeList的列纵线被设置为显示,行横线被设置为不显示,所以只需绘制上下线即可。
e.Graphics.DrawLine(gridPen, e.Bounds.X, e.Bounds.Y, e.Bounds.X + e.Bounds.Width, e.Bounds.Y); //下边缘的线
e.Graphics.DrawLine(gridPen, e.Bounds.X, e.Bounds.Y + e.Bounds.Height, e.Bounds.X + e.Bounds.Width, e.Bounds.Y + e.Bounds.Height);
}
#endregion } //设置处理事件完成(关键点),只有设置为ture,才能显示出想要的结果。
//e.Handled = true; //不想覆盖已有内容就注掉(只绘制边框) } }

  

修改TreeList单元格格式(实现类似单元格合并效果)的更多相关文章

  1. excel将单元格格式由数字转为文本

    由于python读取excel数据时,整数总会变成浮点数,例如1会变成1.0,这时可以通过将excel里面的数字转化为文本,再读取出来就不会变成浮点数了.还有一种情况是excel里面的数字是由公式计算 ...

  2. 王佩丰第2讲-excel单元格格式设置 笔记

    点小箭头都可以进入单元格格式设置 跨越合并 添加斜线 回车 ALT+ENTER 格式刷 数字格式 特定红色 货币VS会计专用 日期 2是1月2号,3是1月3号-- 自定义[例子中是在数值后面加&quo ...

  3. 【JAVA】POI设置EXCEL单元格格式为文本、小数、百分比、货币、日期、科学计数法和中文大写

    POI设置EXCEL单元格格式为文本.小数.百分比.货币.日期.科学计数法和中文大写 博客分类:,本文内容转自 http://javacrazyer.iteye.com/blog/894850 FIL ...

  4. POI设置EXCEL单元格格式为文本、小数、百分比、货币、日期、科学计数法和中文大写

    再读本篇文章之前,请先看我的前一篇文章,前一篇文章中有重点讲到POI设置EXCEL单元格格式为文本格式,剩下的设置小数.百分比.货币.日期.科学计数法和中文大写这些将在下面一一写出 以下将要介绍的每一 ...

  5. Excel单元格格式设置

    工作中遇到一些小问题: 例如办公自动化里的如何设置单元格格式 此格式分为两种:一种是样式上的格式 比如边框 行距字体等 第二种为数据格式: 比如每次我输入1000的话自动变红或者加粗字体 office ...

  6. Excel课程学习第二课单元格格式设置

    今天要讲的是单元格格式的设置,字体字号的设置,边框设置,合并单元格之类的. 下面看看具体的内容: 1.使用单元格格式工具美化表格 1.1设置单元格格式的对话框在哪里? 下图中三个小箭头都能打开设置单元 ...

  7. DataGridView导出数据到Excel及单元格格式的改动

    在软件开发过程中,时常会遇到把一些数据信息从DataGridView中导出到Excel表格中的情况.假设写的多了就会发现挺简单的,我们最好还是来写一写,留作备用,毕竟有时候Ctrl+C和Ctrl+V还 ...

  8. Python生成文本格式的excel\xlwt生成文本格式的excel\Python设置excel单元格格式为文本\Python excel xlwt 文本格式

    Python生成文本格式的excel\xlwt生成文本格式的excel\Python设置excel单元格格式为文本\Python excel xlwt 文本格式 解决: xlwt 中设置单元格样式主要 ...

  9. Excel-转换单元格格式的函数或“方法”汇总

    14.转换单元格格式的函数或"方法"汇总 =value(单元格)  #转换为数值 =A1&""                   #转换A1为文本 = ...

随机推荐

  1. 两个List循环

    package execise; import java.util.ArrayList; import java.util.List; import domain.User; public class ...

  2. Proxy 代理模式 动态代理 cglib MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  3. angular之interceptors拦截器

    <!DOCTYPE html> <html ng-app="nickApp"> <head> <meta charset="UT ...

  4. 【Qt】仿QQ表情选择控件

         表情选择控件在聊天应用中常常要用到,做起来尽管不复杂可是非常繁琐.特别是有些图标须要按顺序排列.每次重做必定是非常费时.所以我将聊天表情选择控件封装成一个独立的类QFaceSelectWid ...

  5. Oracle服务启动顺序导致ORA-12514

    在window 上装了oracle11g,按照常规步骤安装完成后一切OK,如下图所示 C:\Users\Administrator>sqlplus /nolog SQL*Plus: Releas ...

  6. 如何使用千千静听为MP3添加专辑封面和文字信息

    使用千千静听播放器打开某MP3文件,右击该文件,选择属性. 2 点击专辑封面即可添加或更换专辑封面 点击保存到文件再点击重新读取文件即可发现有效了 3 为MP3批量添加添加封面 选中播放列表的所有文件 ...

  7. 翻译记忆软件-塔多思TRADOS经典教程_1

    窗体顶端 网络上关于TRADOS使用的文章很多,但大多数内容涉及的内容都过于广泛,刚准备上手的同行们看了总会觉得不知所云,无从下手.笔者自己也在自学阶段遇到不少麻烦.经过长期的使用和琢磨,终于写了短文 ...

  8. Appium Python 二:理论概念理解

    简介 Appium 是一个开源的自动化测试工具,支持 iOS 平台和 Android 平台上的原生应用,web 应用和混合应用. “移动原生应用”是指那些用 iOS 或者 Android SDK 写的 ...

  9. es6(const、let)

    首先我很好奇,明明现代浏览器支持ES6.ES7不是那么好,为何还推行? var let const 有何区别?它们之间的限制又是什么?且听我娓娓道来 1. var 和let的关系,为何推荐let? ( ...

  10. 微信小程序 - 反编译线上源码

    github地址:https://github.com/qwerty472123/wxappUnpacker 不过我好像从来未成功过哈,TX地图+.TX公交都失败了 点击下载以上两个文件 哦,对了,你 ...