#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; } } } }