基线:全量源码首提(D1 版本控制落地,含第一轮优化 B1-B4/A1/A4/缩放修复)
This commit is contained in:
@@ -0,0 +1,206 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
把旧工具的 Columns.Add + Columns[i].X 写法转换为 SharpDevelop 设计器认的
|
||||
"列字段 + AddRange" 标准 VS 写法,让设计器里能显示列头。
|
||||
"""
|
||||
import io
|
||||
import re
|
||||
import os
|
||||
import glob
|
||||
|
||||
BASE = r"C:\Users\099978\Documents\SharpDevelop Projects\成套报价软件\成套报价软件"
|
||||
|
||||
|
||||
def convert_columns(designer_text, class_name):
|
||||
"""把一个 Designer.cs 里的所有 DataGridView 列定义从旧格式转换为 VS 标准格式"""
|
||||
lines = designer_text.split("\n")
|
||||
out = []
|
||||
all_column_fields = [] # 所有列字段声明
|
||||
all_column_news = [] # 所有列 new 语句
|
||||
all_column_blocks = [] # 所有列属性块
|
||||
|
||||
i = 0
|
||||
while i < len(lines):
|
||||
line = lines[i].strip()
|
||||
|
||||
# 检测: this.xxx.Columns.Add(new System.Windows.Forms.DataGridViewTextBoxColumn());
|
||||
m_add = re.match(r'this\.(\w+)\.Columns\.Add\(new System\.Windows\.Forms\.(\w+Column)\(\)\);', line)
|
||||
if not m_add:
|
||||
out.append(lines[i])
|
||||
i += 1
|
||||
continue
|
||||
|
||||
grid_name = m_add.group(1)
|
||||
col_type = m_add.group(2)
|
||||
|
||||
# 收集后续的 Columns[i].X = ... 行
|
||||
col_idx = 0
|
||||
col_props = []
|
||||
j = i + 1
|
||||
while j < len(lines):
|
||||
st = lines[j].strip()
|
||||
m_prop = re.match(r'this\.' + grid_name + r'\.Columns\[(\d+)\]\.(\w+(?:\.\w+)*)\s*=\s*(.+?);', st)
|
||||
if not m_prop:
|
||||
break
|
||||
idx = int(m_prop.group(1))
|
||||
if idx != col_idx:
|
||||
break
|
||||
col_props.append((m_prop.group(2), m_prop.group(3)))
|
||||
j += 1
|
||||
|
||||
if not col_props:
|
||||
out.append(lines[i])
|
||||
i += 1
|
||||
continue
|
||||
|
||||
# 生成 VS 标准写法
|
||||
# 列名从 HeaderText 取
|
||||
header = ""
|
||||
for prop, val in col_props:
|
||||
if prop == "HeaderText":
|
||||
header = val.strip('"')
|
||||
break
|
||||
field_name = "dataGridViewColumn_%s_%d" % (grid_name, col_idx)
|
||||
|
||||
# 收集属性
|
||||
prop_lines = []
|
||||
for prop, val in col_props:
|
||||
if prop == "Name" and val == '""':
|
||||
continue # 跳过空 Name
|
||||
prop_lines.append("\t\t\tthis.%s.%s = %s;" % (field_name, prop, val))
|
||||
|
||||
all_column_news.append("\t\t\tthis.%s = new System.Windows.Forms.%s();" % (field_name, col_type))
|
||||
all_column_blocks.append("\t\t\t// \n\t\t\t// %s\n\t\t\t// " % field_name)
|
||||
all_column_blocks.extend(prop_lines)
|
||||
all_column_fields.append("\t\tprivate System.Windows.Forms.%s %s;" % (col_type, field_name))
|
||||
|
||||
# 记住这个列属于哪个 grid
|
||||
if not hasattr(convert_columns, "_grid_cols"):
|
||||
convert_columns._grid_cols = {}
|
||||
convert_columns._grid_cols.setdefault(grid_name, []).append(field_name)
|
||||
|
||||
col_idx += 1
|
||||
# 继续找下一个 Columns.Add(同一 grid 的下一列)
|
||||
while j < len(lines):
|
||||
st2 = lines[j].strip()
|
||||
m_next = re.match(r'this\.' + grid_name + r'\.Columns\.Add\(new System\.Windows\.Forms\.(\w+Column)\(\)\);', st2)
|
||||
if m_next:
|
||||
col_type2 = m_next.group(1)
|
||||
j += 1
|
||||
col_props2 = []
|
||||
while j < len(lines):
|
||||
st3 = lines[j].strip()
|
||||
m_prop2 = re.match(r'this\.' + grid_name + r'\.Columns\[(\d+)\]\.(\w+(?:\.\w+)*)\s*=\s*(.+?);', st3)
|
||||
if not m_prop2:
|
||||
break
|
||||
col_props2.append((m_prop2.group(2), m_prop2.group(3)))
|
||||
j += 1
|
||||
|
||||
field_name2 = "dataGridViewColumn_%s_%d" % (grid_name, col_idx)
|
||||
for prop, val in col_props2:
|
||||
if prop == "HeaderText":
|
||||
header2 = val.strip('"')
|
||||
break
|
||||
prop_lines2 = []
|
||||
for prop, val in col_props2:
|
||||
if prop == "Name" and val == '""':
|
||||
continue
|
||||
prop_lines2.append("\t\t\tthis.%s.%s = %s;" % (field_name2, prop, val))
|
||||
all_column_news.append("\t\t\tthis.%s = new System.Windows.Forms.%s();" % (field_name2, col_type2))
|
||||
all_column_blocks.append("\t\t\t// \n\t\t\t// %s\n\t\t\t// " % field_name2)
|
||||
all_column_blocks.extend(prop_lines2)
|
||||
all_column_fields.append("\t\tprivate System.Windows.Forms.%s %s;" % (col_type2, field_name2))
|
||||
convert_columns._grid_cols.setdefault(grid_name, []).append(field_name2)
|
||||
col_idx += 1
|
||||
else:
|
||||
break
|
||||
|
||||
# 跳过所有已消费的行
|
||||
i = j
|
||||
|
||||
# 在 SuspendLayout 之前插入列的 new 语句
|
||||
result = []
|
||||
inserted_news = False
|
||||
for line in out:
|
||||
if not inserted_news and "this.SuspendLayout()" in line:
|
||||
result.extend(all_column_news)
|
||||
inserted_news = True
|
||||
result.append(line)
|
||||
|
||||
# 在最后一个控件属性块之后、Controls.Add 之前插入列属性块和 AddRange
|
||||
final = []
|
||||
inserted_blocks = False
|
||||
for k, line in enumerate(result):
|
||||
# 找 Controls.Add 或 AddRange(第一个容器层级的地方)
|
||||
if not inserted_blocks and re.search(r'this\.\w+\.Controls\.Add', line.strip()):
|
||||
# 插入列属性块
|
||||
final.extend(all_column_blocks)
|
||||
# 插入每个 grid 的 Columns.AddRange
|
||||
for grid_name, fields in convert_columns._grid_cols.items():
|
||||
inner = ",\n\t\t\t\t".join("this.%s" % f for f in fields)
|
||||
final.append("\t\t\tthis.%s.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {" % grid_name)
|
||||
final.append("\t\t\t\t" + inner + "});")
|
||||
final.append("")
|
||||
inserted_blocks = True
|
||||
final.append(line)
|
||||
|
||||
if not inserted_blocks:
|
||||
# 没找到 Controls.Add,直接在 ResumeLayout 前插
|
||||
final2 = []
|
||||
for line in final:
|
||||
if "this.ResumeLayout" in line and not inserted_blocks:
|
||||
final2.extend(all_column_blocks)
|
||||
for grid_name, fields in convert_columns._grid_cols.items():
|
||||
inner = ",\n\t\t\t\t".join("this.%s" % f for f in fields)
|
||||
final2.append("\t\t\tthis.%s.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {" % grid_name)
|
||||
final2.append("\t\t\t\t" + inner + "});")
|
||||
final2.append("")
|
||||
inserted_blocks = True
|
||||
final2.append(line)
|
||||
final = final2
|
||||
|
||||
# 在最后一个 private 字段声明之前插入列字段
|
||||
final3 = []
|
||||
inserted_fields = False
|
||||
for line in final:
|
||||
if not inserted_fields and re.match(r'\t\tprivate ', line) and "Column" not in line:
|
||||
final3.extend(all_column_fields)
|
||||
final3.append("")
|
||||
inserted_fields = True
|
||||
final3.append(line)
|
||||
|
||||
if not inserted_fields:
|
||||
final3.extend(all_column_fields)
|
||||
|
||||
# 清理类级变量
|
||||
convert_columns._grid_cols = {}
|
||||
|
||||
return "\n".join(final3), len(all_column_fields)
|
||||
|
||||
|
||||
def process_file(path):
|
||||
s = io.open(path, encoding="utf-8-sig").read()
|
||||
# 提取类名
|
||||
m = re.search(r'partial class (\w+)', s)
|
||||
if not m:
|
||||
return 0
|
||||
class_name = m.group(1)
|
||||
|
||||
# 检查是否有旧格式的列定义
|
||||
if "Columns.Add(new" not in s:
|
||||
return 0
|
||||
|
||||
new_s, n_cols = convert_columns(s, class_name)
|
||||
if n_cols > 0:
|
||||
io.open(path, "w", encoding="utf-8-sig", newline="\r\n").write(new_s)
|
||||
print("%s: 转换了 %d 个列字段" % (os.path.basename(path), n_cols))
|
||||
return n_cols
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
total = 0
|
||||
for pattern in ["xiangmu/*.Designer.cs", "shezhi/*.Designer.cs",
|
||||
"ku/*.Designer.cs", "GCS母排计算/*.Designer.cs"]:
|
||||
for f in glob.glob(os.path.join(BASE, pattern)):
|
||||
total += process_file(f)
|
||||
print("\n共转换 %d 个列" % total)
|
||||
Reference in New Issue
Block a user