一、前言

前提是 C1FlexGrid 中存在数据绑定列和自定义列(非数据绑定列),此时如果该行编辑后出现排他错误,自定义列也会出现验证结果的红色边框:

但是自定义列如果只是一些按钮操作,提示说明什么的,与前面绑定的数据并无关系,不想参与到前面的排他错误提示,也就是不想要这个红色边框,该如何处理?

二、实现

 using System.Collections.ObjectModel;
using System.ComponentModel; namespace Validation
{
public class DataObject : IDataErrorInfo
{
public string Name { get; set; }
public int Age { get; set; }
public string Sex { get; set; }
public string UpdateErrorMessage { get; set; } // property-level
public string this[string propertyName]
{
get
{
if (!string.IsNullOrEmpty(UpdateErrorMessage))
{
return UpdateErrorMessage;
}
if (propertyName == "Name" && string.IsNullOrWhiteSpace(Name))
{
return "Name is invalid!";
} return string.Empty;
}
} // item-level
string IDataErrorInfo.Error
{
get
{
if (!string.IsNullOrEmpty(UpdateErrorMessage))
{
return UpdateErrorMessage;
} return "";
}
} // 初始化数据源
public static ObservableCollection<DataObject> InitDataSource()
{
ObservableCollection<DataObject> itemSource = new ObservableCollection<DataObject>();
itemSource.Add(new DataObject() {
Name = "aa",
Age = 11,
Sex = "男" });
itemSource.Add(new DataObject() {
Name = "vv",
Age = 15,
Sex = "男" });
itemSource.Add(new DataObject() {
Name = "aa",
Age = 11,
Sex = "男" });
itemSource.Add(new DataObject() {
Name = "aa",
Age = 11,
Sex = "男" });
itemSource.Add(new DataObject() {
Name = "aa",
Age = 11,
Sex = "男" });
itemSource.Add(new DataObject() {
Name = "aa",
Age = 11,
Sex = "男" });
itemSource.Add(new DataObject() {
Name = "aa",
Age = 11,
Sex = "男" }); return itemSource;
}
}
}

数据对象

首先我模拟一个验证方法,当输入的 Name 为 kk 时,即出现排他错误:

// 数据验证
private bool Verify(int rowIndex)
{
bool flag = false;
DataObject selectedItem = (DataObject)flx.SelectedItem;
flag = (selectedItem != null && selectedItem.Name.Equals("kk")); return flag;
}

然后在行编辑完成时(RowEditEnding),进行判断处理排他错误信息:

private void flx_RowEditEnding(object sender, C1.WPF.FlexGrid.CellEditEventArgs e)
{
C1FlexGrid flexGrid = sender as C1FlexGrid;
// 满足某些条件时出现验证错误
if (Verify(e.Row))
{
((DataObject)flexGrid.SelectedItem).UpdateErrorMessage = "Error!!";
// 重绘当前行
flexGrid.Invalidate(new CellRange(e.Row, -1, e.Row, flexGrid.Columns.Count - 1));
// 重绘该行行头部分,已显示小红点提示
flexGrid.RowHeaders.Invalidate();
e.Cancel = true;
}
else
{
((DataObject)flexGrid.SelectedItem).UpdateErrorMessage = "";
}
}

其中

flexGrid.Invalidate(new CellRange(e.Row, -1, e.Row, flexGrid.Columns.Count - 1));

是为了重新绘制当前行,否则当设置完排他错误 UpdateErrorMessage 时,只会绘制当前单元格的红色边框,该行其他的单元格不会绘制;

其中

flexGrid.RowHeaders.Invalidate();

是为了绘制行头的那个红色点;

下面才是解决问题的关键:

其实也很简单,就是将最后自定义列重新绘制一遍即可:

public class MyCellFactory : CellFactory
{
public override void CreateCellContent(C1FlexGrid grid, Border bdr, CellRange rng)
{
base.CreateCellContent(grid, bdr, rng);
// 处理最后一列非绑定列的边框重绘
if (rng.Column == grid.Columns.Count - 1)
{
bdr.BorderThickness = new Thickness(0, 0, 1, 1);
bdr.BorderBrush = new SolidColorBrush(Color.FromArgb(255, 240, 240, 240));
bdr.UpdateDefaultStyle();
}
}
}

其中 base.CreateCellContent(grid, bdr, rng); 里面就已经将单元格的排他错误样式绘制完了,所以一定要在这之后再手动绘制自定义列,参考上面的代码;

最后实现的效果如下:

[C1] C1FlexGrid 排除非绑定列的验证效果的更多相关文章

  1. GridView 动态添加绑定列和模板列

    动态添加绑定列很简单:例如: GridView1.DataSourceID = "SqlDataSource1"; BoundField bf1 = new BoundField( ...

  2. Silverlight C1.Silverlight.FlexGrid 表格动态列

    很多时候,我们对于表格展示的数据,需要根据条件不停的变化,这就需要表格列能动态生成,即没有Model的概念(万物始于无形).先上主要代码: 一.根据参数绑定列定义 二.根据数据动态创建数据对象,并添加 ...

  3. DEV XtraGrid绑定非绑定列(转)

      在Gridview创建一列 .将该列的UnboundType属性设置为bound(默认值)以外的数据类型 为该列设置一个窗体内全局唯一的FieldName,注意这个FieldName甚至不能出现在 ...

  4. 在php中使用对称加密DES3,开发银行卡绑定,实名验证……

    对称加密:对称加密是一种数据加密算法,对一组数据的加密和解密都使用一样的密钥(key),可以有效保护金融数据,常见的对称加密有DES,3DES,AES.RC2.RC4.RC5. DES3: 对DES算 ...

  5. WPF DATAGrid 空白列 后台绑定列 处理

    原文:WPF DATAGrid 空白列 后台绑定列 处理 AutoGenerateColumns <DataGrid x:Name="dataGrid" Margin=&qu ...

  6. 管理员技术(五): 配置文档的访问权限、 配置附加权限、绑定到LDAP验证服务、配置LDAP家目录漫游

    一.配置文档的访问权限 问题: 本例要求将文件 /etc/fstab 拷贝为 /var/tmp/fstab,并调整文件 /var/tmp/fstab的权限,满足以下要求: 1>  此文件的拥有者 ...

  7. 【bootstrapValidator 不验证】使用bootstrapValidator 验证效果不起作用

    虽然在页面ready的时候 就绑定了验证表单 ,但是在点击提交按钮之后 依旧没有验证的效果 . 那就在提交按钮的点击事件中 添加一句话: $(document).ready( function () ...

  8. Jquery绑定事件及动画效果

    Jquery绑定事件及动画效果 本文转载于:https://blog.csdn.net/Day_and_Night_2017/article/details/85799522 绑定事件 bind(ty ...

  9. [C1] C1FlexGrid 行列增删&单元格合并拆分

    上一篇中实现了 C1FlexGrid的撤销还原功能,这篇是要仿 Excel 做一个行列删除以及单元格的自由合并拆分,楼主怕在原工程里复杂的说不清道不明,所以干脆提取出来做了一个 Demo 来说明实现过 ...

随机推荐

  1. Hawk 6. 编译和扩展开发

    Hawk是开源项目,因此任何人都可以为其贡献代码.作者也非常欢迎使用者能够扩展出更有用的插件. 编译 编译需要Visual Stuido,版本建议使用2015, 2010及以上没有经过测试,但应该可以 ...

  2. CRL快速开发框架系列教程六(分布式缓存解决方案)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  3. css text-fill-color与text-stroke讲解

    顾名思义"text-fill-color"就是文字填充颜色而"text-stroke"就是文字描边.还别说,两个属性可以制作出各种炫酷的文字效果,不过IE系列都 ...

  4. WPF 捕获键盘输入事件

    最近修改的一个需求要求捕获键盘输入的 Text,包括各种标点符号. 最开始想到的是 PreviewKeyDown 或者 PreviewKeyUp 这样的键盘事件. 但是这两个事件的对象 KeyEven ...

  5. spring maven pom.xml设置

    spring pom.xml设置 <?xml version="1.0" encoding="UTF-8"?> <project xmlns= ...

  6. Springboot搭建web项目

    最近因为项目需要接触了springboot,然后被其快速零配置的特点惊呆了.关于springboot相关的介绍我就不赘述了,大家自行百度google. 一.pom配置 首先,建立一个maven项目,修 ...

  7. 设计模式C#合集--工厂方法模式

    简单工厂,代码: public interface ISpeak { public void Say(); } public class Hello : ISpeak { public void Sa ...

  8. Linux常用命令

    命令格式与目录处理命令 ls 命令格式与目录处理命令 ls 命令格式:命令 [-选项][参数] 例:ls -la /etc 说明: 1)个别命令使用不遵循格式 2)当有多个选项时,可以写在一起 3)简 ...

  9. EMD分析 Matlab 精华总结 附开源工具箱(全)

    前言: 本贴写于2016年12与15日,UK.最近在学习EMD(Empirical Mode Decomposition)和HHT(Hilbert-Huang Transform)多分辨信号处理,FQ ...

  10. Centos、Ubuntu 安装 Mono、Jexus

    Mono是.NET的跨平台实现 在众多关于语言的争论中,.NET一直被以不能跨平台而诟病,Mono改变了这一现状. 有人当心Mono会涉及版权啥的问题.高深的偶不懂,不过我觉得Unity3D都能用,为 ...