/// <summary>
/// 对gridView数据进行筛选 返回RowFilter 字符,如果有PY列,则会一并处理 注意 返回是 and (xxx like xxx) 有And 进行连接
/// </summary>
/// <param name="view">要筛选的GridView 仅处理显示列</param>
/// <param name="_inputTxt">要筛选的文本,中间可以有空格,具体空格用途见第三个参数,注意不要对用户录入的txt做特殊字符过滤处理</param>
/// <param name="comperType">如果要筛选的文本,中间可以有空格,则要如何处理,默认不处理 类似如 用户录入 湖南 长沙,可以筛选出包含湖南和长沙的内容 </param>
/// <returns>注意 返回是 and (xxx like xxx) 有And 进行连接</returns>
public static string GetDataTable_LikeString(DevExpress.XtraGrid.Views.Grid.GridView view, string _inputTxt, EnComperType comperType = EnComperType.None)
{
if (view == null || view.GridControl == null || string.IsNullOrEmpty(_inputTxt))
return "";
DataTable dt = view.GridControl.DataSource as DataTable;
if (dt == null)
return "";
List<string> visableCol = new List<string>();
foreach (DevExpress.XtraGrid.Columns.GridColumn col in view.VisibleColumns)
{
visableCol.Add(col.FieldName);
}
//处理所有以PY列开头或结尾的
foreach (DataColumn item in dt.Columns)
{
if (item.ColumnName.ToUpper().StartsWith("PY") || item.ColumnName.ToUpper().EndsWith("PY"))
visableCol.Add("PY");
}
string strFilter = "";
string[] spinput = _inputTxt.Trim().Split(' ', ' ');
List<string> spinput2 = new List<string>();
foreach (string item in spinput)
{
if (item.Trim() == "")
continue;
if (!spinput2.Contains(item.Trim()))
spinput2.Add(item.Trim());
}
if (spinput2.Count > 1)
{
if (comperType == EnComperType.None)
{
strFilter = GetDataTable_LikeString_Base(dt, _inputTxt, string.Join(",", visableCol.ToArray()));
}
else
{
string tempstr = "";
for (int i = 0; i < spinput2.Count; i++)
{
tempstr = GetDataTable_LikeString_Base(dt, spinput2[i], string.Join(",", visableCol.ToArray()));
if (i == 0)
{
strFilter = tempstr;
}
else
{
strFilter = strFilter + (comperType == EnComperType.And ? " And " : " Or ") + tempstr;
}
}
}
}
else
{
strFilter = GetDataTable_LikeString_Base(dt, _inputTxt, string.Join(",", visableCol.ToArray()));
}
if (strFilter.Length > 0)
{
strFilter = " AND ( " + strFilter + ") ";
}
return strFilter;
}
/// <summary>
/// 对DataTable数据进行筛选 返回RowFilter 字符,如果有PY列,则会一并处理 注意 返回是 (xxx like xxx) 没有And 进行连接
/// </summary>
/// <param name="sourceDT">目标表</param>
/// <param name="_inputTxt">需要匹配的字符串</param>
/// <param name="isRepRowFilterStr">是否需要做ToRowFilterStr 特殊字符过滤 处理,</param>
/// <returns>返回 ( filedName like '%ZS%')</returns>
public static string GetDataTable_LikeString_Base(DataTable sourceDT, string _inputTxt, string filterColumsStr, bool isRepRowFilterStr = true)
{
if (string.IsNullOrEmpty(_inputTxt))
return "";
StringBuilder strB = new StringBuilder();
string likeStr = isRepRowFilterStr ? _inputTxt.ToRowFilterStr() : _inputTxt;
if (_inputTxt.Contains("%"))
likeStr = _inputTxt;
else
likeStr = $"%{likeStr}%";
//判断目标表是否为空,是否没有列
if (sourceDT == null || sourceDT.Columns.Count == 0)
return "";
//循环所有的列
foreach (DataColumn columnCollection in sourceDT.Columns)
{
//columnCollection.DataType.FullName.Dump();
string rowfilterFiled = "";// Convert(AddTime, 'System.String')
string columnName = columnCollection.ColumnName.ToStringNull();
if (columnName == "")
continue;
if (filterColumsStr != null)
{
var filterColums = filterColumsStr.Split(',', ',');
if (filterColums.Length > 0)
if (!Array.Exists(filterColums, (t) => { return t.Trim().ToUpper() == columnName.Trim().ToUpper(); }))
{
continue;
}
}
switch (columnCollection.DataType.FullName)
{
case "System.Int32":
case "System.Int64":
case "System.Decimal":
case "System.Single":
case "System.Double":
case "System.DateTime":
rowfilterFiled = "Convert([" + columnName + "], 'System.String')";
break;
case "System.String":
rowfilterFiled = "[" + columnName + "]";
break;
}
if (string.IsNullOrEmpty(rowfilterFiled))
continue;
strB.Append($"{rowfilterFiled} like '{likeStr}' OR ");
}
string filterStr = strB.ToString();
if (filterStr.Length > 0) //有数据
{
//去掉最后的“ OR ”
filterStr = "(" + filterStr.Substring(0, filterStr.Length - 3) + ")";
}
return filterStr;
}
/// <summary>
/// 当录入内容有空格时,要怎么处理
/// </summary>
public enum EnComperType
{
/// <summary>
/// 不处理录入的筛选内容是否有空格
/// </summary>
None,
/// <summary>
///如果用户录入有空格,则进行空格前 后使用And拼接
/// </summary>
And,
/// <summary>
/// 如果用户录入有空格,则进行空格前 后使用Or拼接
/// </summary>
Or,
}