1
yhj
2024-07-24 5e5d945e91568b973faa27d8ab0bcef99fc4a6c5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
#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
{
    /// <summary>
    ///     自动生成明细表排序序号
    /// </summary>
    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; //步辐.
 
        /// <summary>
        ///     生成排序字符串.
        ///     Insert方法生成规则,假设当前记录为n:
        ///     Append方法生成规则:生成的排序字符串为max(n)+1
        /// </summary>
        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;
            }
        }
 
        /// <summary>
        ///     获取最大的排序编号
        /// </summary>
        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);
            }
        }
 
        /// <summary>
        ///     获取列的排序序号数组.
        /// </summary>
        /// <param name="view">表格控件</param>
        /// <param name="col">列</param>
        /// <returns></returns>
        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;
            }
        }
 
        /// <summary>
        ///     生成一个新的排序编号
        /// </summary>
        /// <param name="currSortingID">当前行的Sort编号</param>
        /// <param name="prevSortingID">前一行的Sort编号</param>
        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;
            }
        }
    }
}