本帖最后由 gksj 于 2023-10-20 18:53 编辑
using System;
using System.Reflection;
using System.Windows.Forms;
namespace DianZan.sOptions
{
class ReadOptions
{
public ReadOptions(Form rform)
{
Forms = rform; //传递Form本地化
fieldInfoList = Forms.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance);//获取窗体下所有控件集合
}
private Form Forms { get; set; }
private FieldInfo[] fieldInfoList { get; set; }
private void R2ReadLangData()
{
foreach (LangOption co in OptionData.LangList) //数据拆包
{
string rName = co.Name; //控件Name属性
string rText = co.Text; //控件Text属性
foreach (FieldInfo fi in fieldInfoList)
{
try
{
Type fType = fi.FieldType; //获取操作数据所在类
object control = Convert.ChangeType(rText, fType.GetProperty(rName).PropertyType);//修改对应属性的值 (每次到这里都提示未将对象引用设置的实例)
fType.GetProperty(rName).SetValue(fi, control, null); //赋值
}
catch (Exception ex)
{
string errStr = ex.Message;
}
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace DianZan.sOptions
{
struct LangOption
{
public string Name { get; set; }
public string Text { get; set; }
}
class OptionData
{
public static List<LangOption> LangList { get; set; }
}
}
## 保存的数据格式参考
https://www.52pojie.cn/thread-1839902-1-1.html
最早的方案是用Control.Find实现的,但是因为StatusStrip类不是继承自Control,所以这个方法就失效了,希望各位大神帮帮忙
还有几种控件也不是继承自Control,所以最终想到反射这个没有办法的办法
在这之前用了3天时间已经把StatusStrip和所有下属的容器子类都拆明白了,数据已经全部取到,现在读取遇到问题了
主要的目的就是从文本中读取配置,配置里面存着这个控件的Name和Text(当然不同类型控件还有其他值)
然后根据Name名称给这个控件指定的属性赋值.
感谢@pjy612 提供的代码和思路,问题已解决
[C#] 纯文本查看 复制代码 private string R2ReadLangData(FileOptType fileOptType)
{
string rStr = OptionFile.aOptFile(fileOptType); //默认配置参数
foreach (FieldInfo field in fieldInfoList)
{
var fType = field.FieldType; //获取类型
var fObj = field.GetValue(Forms); //获取类型数据
var fName = fType.GetProperty("Name");
if (fName == null)
{
continue;//没有控件对应属性
}
string cName = (string)fName.GetValue(fObj, null);
LangOption langOpt = OptionData.LangList.Find(f => f.Name == cName);
if (langOpt.Name == null)
{
continue;//未找配置文件的索引属性
}
var cText = fType.GetProperty("Text");
if (cText == null)
{
continue;//没有控件对应属性
}
cText.SetValue(fObj, langOpt.Text, null);
}
return rStr;
}
[C#] 纯文本查看 复制代码 private string R3ReadOptionData(string filePath, FileOptType fileOptType)
{
string rStr = null;
switch (fileOptType)
{
case FileOptType.ReadDefault:
rStr = OptionFile.aOptFile(FileOptType.ReadDefault); //默认配置参数
break;
case FileOptType.ReadOption:
rStr = OptionFile.aOptFile(filePath, FileOptType.ReadOption);//用户自定义配置参数
break;
}
foreach (FieldInfo field in fieldInfoList)
{
var fType = field.FieldType; //获取类型
var fObj = field.GetValue(Forms); //获取类型数据
var fName = fType.GetProperty("Name");
if (fName == null)
{
continue;//没有控件对应属性
}
string cName = (string)fName.GetValue(fObj, null);
CtrOption ctrOpt = OptionData.CtrList.Find(f => f.Name == cName);
if (ctrOpt.Name == null)
{
continue;//未找配置文件的索引属性
}
if (fObj is TextBox)
{
((TextBox)fObj).Text = Convert.ToString(ctrOpt.Value);
}
if (fObj is ComboBox)
{
((ComboBox)fObj).SelectedIndex = Convert.ToInt32(ctrOpt.Value);
}
if (fObj is CheckBox)
{
((CheckBox)fObj).Checked = Convert.ToBoolean(ctrOpt.Value);
}
}
return rStr;
} |