#region
using System;
using System.Collections;
using CSFrameworkV5.Common;
using CSFrameworkV5.Core;
using DevExpress.XtraGrid.Columns;
using DevExpress.XtraGrid.Views.Grid;
#endregion
namespace CSFrameworkV5.Library.CommonClass
{
///
/// 自动生成明细表排序序号
///
public class GenerateSortID
{
public readonly string DEF_FIRST_SORTING = "1"; //从1开始
public readonly string DEF_FIRST_SORTING_PRIOR = "0.0";
public readonly int DEF_MAX_SORTING_LENGTH = 20; //生的在序号最大长度
public readonly string DEF_SORTING_SEPRATOR = ".";
public readonly decimal DEF_STEP = (decimal)0.2; //步辐.
///
/// 生成排序字符串.
/// Insert方法生成规则,假设当前记录为n:
/// Append方法生成规则:生成的排序字符串为max(n)+1
///
public string Generate(GridView view, GridColumn sortingColumn)
{
try
{
var list = GetMRUFilters(view, sortingColumn);
if (view.RowCount <= 0) return DEF_FIRST_SORTING; //设置默认排序ID
var pos = view.FocusedRowHandle;
var value = 0;
if (pos < 0) //没有当前记录. 以Append方式生成排序字符串
{
value = GetMaxSortingID(list);
return ConvertEx.ToString(value) + DEF_SORTING_SEPRATOR;
}
if (pos == view.RowCount - 1) // 视为Append.
{
var currID =
ConvertEx.ToString(
view.GetRowCellValue(pos, sortingColumn));
var append = decimal.Parse(currID) + DEF_STEP;
return append.ToStringEx();
}
var currobj = view.GetRowCellValue(pos, sortingColumn);
//Sorting最大长度为20. 如果生成的SortingID大於20.则取当前的SortingID
if (ConvertEx.ToString(currobj).Length >=
DEF_MAX_SORTING_LENGTH) return ConvertEx.ToString(currobj);
var preobj = view.GetRowCellValue(pos - 1, sortingColumn);
if (ConvertEx.ToString(preobj) ==
"") preobj = 0; //如果当前记录是第一条, 那麽上一条记录为0.
return GetNewSortingID(ConvertEx.ToString(currobj),
ConvertEx.ToString(preobj));
}
catch
{
return DEF_FIRST_SORTING;
}
}
///
/// 获取最大的排序编号
///
public int GetMaxSortingID(ArrayList sortingFilters)
{
try
{
sortingFilters.Sort();
var str =
ConvertEx.ToString(
sortingFilters[sortingFilters.Count - 1]);
var arr = str.Split(Convert.ToChar(DEF_SORTING_SEPRATOR));
return Convert.ToInt16(arr[0]);
}
catch
{
return int.Parse(DEF_FIRST_SORTING);
}
}
///
/// 获取列的排序序号数组.
///
/// 表格控件
/// 列
///
public ArrayList GetMRUFilters(GridView view, GridColumn col)
{
var list = new ArrayList();
try
{
for (var i = 0; i < view.RowCount; i++)
{
var o = view.GetRowCellValue(i, col);
if (!list.Contains(o) &&
!o.ToStringEx().Equals(string.Empty)) list.Add(o);
}
list.Sort(); //默认为Ascedent
return list;
}
catch
{
return list;
}
}
///
/// 生成一个新的排序编号
///
/// 当前行的Sort编号
/// 前一行的Sort编号
public string GetNewSortingID(string currSortingID,
string prevSortingID)
{
try
{
if (prevSortingID == null)
prevSortingID = DEF_FIRST_SORTING_PRIOR;
var prefix = decimal.Parse(prevSortingID);
var curr = decimal.Parse(currSortingID);
var newid = (curr - prefix) / 2 + prefix;
var ret = newid.ToStringEx();
return ret.Replace("5", "4");
}
catch
{
return currSortingID;
}
}
}
}