保存赋值:
方法比较笨,有更加快速的方法,不用写这么多代码,当时时间有限没有多做思考。(优化通过字典和动态数组还有结构体可以实现更加便捷的代码);
废话不多说,先上现在的代码,以后有空再优化;
建立一个结构体 用以存储控件的状态或数据(变量名和控件名相同);
public struct Set_up_the
{
//软件设置
public static bool radio_S_vehicle;
public static bool radio_all;
public static bool radio_S_Growss;
public static bool radio_S_Net;
public static bool radio_D_Percent;
public static bool radio_D_Kg;
public static bool check1;
public static bool check2;
public static bool check3;
public static bool checkWeight1;
public static bool checkWeight2;
public static bool checkWeight3;
public static bool checkWeight4;
public static bool checkWeight5;
public static bool checkWeight6;
public static string stringWeight1;
public static string stringWeight2;
public static string stringWeight3;
public static string stringWeight4;
public static string stringWeight5;
public static string stringWeight6;
public static decimal nGross_weight;
public static decimal nNet_weight;
public static decimal nTimeout;
public static decimal nOriginal;
public static decimal nUP_percent;
public static decimal nLow_percent;
public static decimal nUp_Kg;
public static decimal nLow_Kg;
//摄像机设置
public static bool checkVeido1;
public static bool checkVeido2;
public static bool checkVeido3;
public static string strVeidoIP1;
public static string strVeidoIP2;
public static string strVeidoIP3;
public static string strVedioName1;
public static string strVedioName2;
public static string strVedioName3;
public static string strVedioPass1;
public static string strVedioPass2;
public static string strVedioPass3;
public static string strVedioCom1;
public static string strVedioCom2;
public static string strVedioCom3;
}
然后给结构体字段赋值;
LinkOperation.Set_up_the.checkVeido1 = chkBox_Videouse1.Checked;
就是这个样子;
OK值赋好,需要将这些数据保存本地,以便记录。
public void saveSetSystem()
{
//通过循环结构体,可以拿到变量名,变量值,变量类型,OK这样我们就可以愉快的向本地保存数据了
foreach (FieldInfo field in typeof(Set_up_the).GetFields(BindingFlags.Instance |
BindingFlags.NonPublic |
BindingFlags.Public | BindingFlags.Static))
{
string name = field.Name;
object value = field.GetValue(set_Up_The);
if (field.FieldType.Name == "Boolean")
{
config.AddOrSetConfigValue(name, value);
}
if (field.FieldType.Name == "String")
{
if (value != null)
{
config[name] = value.ToString();
}
}
if (field.FieldType.Name == "Decimal")
{
if (value != null)
{
config.AddOrSetConfigValue(name, value);
}
}
}
for(int i=0;i<3; i++)
{
config["DVRIPAddress"+i] = DVRIPAddress[i];
config["DVRUserName" + i] =DVRUserName[i];
config["DVRPassword" + i] =DVRPassword[i];
config.AddOrSetConfigValue("DVRPortNumber"+i, DVRPortNumber[i]);
config.AddOrSetConfigValue("Check_Videouse"+i, Check_Videouse[i]);
config.AddOrSetConfigValue("m_lUserID"+i, m_lUserID[i]);
}
}
哦,贴一个保存本地的类,这个还行,不是我写的,搬砖搬来的。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.IO;
namespace Unattended
{
public class ConfigFile
{
protected readonly string configBasePath = "Root/Config";
/// <summary>
/// 当前配置文件的完整路径
/// </summary>
public string FileName { get; private set; }
/// <summary>
/// 获取或设置配置
/// </summary>
/// <param name="key">键名</param>
/// <returns>键名对应的值</returns>
public string this[string key]
{
get
{
return GetConfigValue(key);
}
set
{
AddOrSetConfigValue(key, value);
}
}
/// <summary>
/// 构造函数
/// </summary>
protected ConfigFile()
{
}
/// <summary>
/// 读取配置文件
/// </summary>
/// <param name="filename">配置文件名</param>
/// <returns>ConfigFile对象</returns>
public static ConfigFile LoadFile(string filename)
{
if (!File.Exists(filename)) return null;
return new ConfigFile { FileName = filename };
}
/// <summary>
/// 读取或创建配置文件
/// </summary>
/// <param name="filename">配置文件名</param>
/// <returns>ConfigFile对象</returns>
public static ConfigFile LoadOrCreateFile(string filename)
{
if (!File.Exists(filename))
{
var config = new ConfigFile { FileName = filename };
config.CreateFile();
return config;
}
return LoadFile(filename);
}
/// <summary>
/// 创建配置文件,可在子类中重写此方法
/// </summary>
protected virtual void CreateFile()
{
XmlDocument doc = new XmlDocument();
XmlDeclaration dec = doc.CreateXmlDeclaration("1.0", "UTF-8", null);
doc.AppendChild(dec);
XmlElement root = doc.CreateElement("Root");
doc.AppendChild(root);
root.AppendChild(doc.CreateElement("Config"));
doc.Save(FileName);
}
/// <summary>
/// 根据Key从配置文件中获取值
/// </summary>
/// <param name="key">键名</param>
/// <returns>获取的值,找不到返回""</returns>
public string GetConfigValue(string key)
{
return GetKeyValue($"{configBasePath}/{key}");
}
/// <summary>
/// 从配置文件中根据key获取值并转化为相应数据类型
/// </summary>
/// <param name="key">键名</param>
/// <param name="result">转化后的值</param>
/// <returns>转化是否成功</returns>
public bool TryParseConfigValue(string key, out int result)
{
var v = GetConfigValue(key);
return int.TryParse(v, out result);
}
/// <summary>
/// 从配置文件中根据key获取值并转化为相应数据类型
/// </summary>
/// <param name="key">键名</param>
/// <param name="result">转化后的值</param>
/// <returns>转化是否成功</returns>
public bool TryParseConfigValue(string key, out bool result)
{
var v = GetConfigValue(key);
return bool.TryParse(v, out result);
}
/// <summary>
/// 从配置文件中根据key获取值并转化为相应数据类型
/// </summary>
/// <param name="key">键名</param>
/// <param name="result">转化后的值</param>
/// <returns>转化是否成功</returns>
public bool TryParseConfigValue(string key, out DateTime result)
{
var v = GetConfigValue(key);
return DateTime.TryParse(v, out result);
}
/// <summary>
/// 从配置文件中根据key获取值并转化为相应数据类型
/// </summary>
/// <param name="key">键名</param>
/// <param name="result">转化后的值</param>
/// <returns>转化是否成功</returns>
public bool TryParseConfigValue(string key, out float result)
{
var v = GetConfigValue(key);
return float.TryParse(v, out result);
}
/// <summary>
/// 从配置文件中根据key获取值并转化为相应数据类型
/// </summary>
/// <param name="key">键名</param>
/// <param name="result">转化后的值</param>
/// <returns>转化是否成功</returns>
public bool TryParseConfigValue(string key, out double result)
{
var v = GetConfigValue(key);
return double.TryParse(v, out result);
}
/// <summary>
/// 从配置文件中根据key获取值并转化为相应数据类型
/// </summary>
/// <param name="key">键名</param>
/// <param name="result">转化后的值</param>
/// <returns>转化是否成功</returns>
public bool TryParseConfigValue(string key, out decimal result)
{
var v = GetConfigValue(key);
return decimal.TryParse(v, out result);
}
/// <summary>
/// 在配置文件中根据key取出值并转化为int类型
/// </summary>
/// <param name="key"></param>
/// <returns>返回的值</returns>
public int GetConfigValueInt(string key)
{
var v = GetConfigValue(key);
return int.Parse(v);
}
/// <summary>
/// 在配置文件中根据key取出值并转化为bool类型
/// </summary>
/// <param name="key"></param>
/// <returns>返回的值</returns>
public bool GetConfigValueBool(string key)
{
var v = GetConfigValue(key);
return bool.Parse(v);
}
/// <summary>
/// 在配置文件中根据key取出值并转化为float类型
/// </summary>
/// <param name="key"></param>
/// <returns>返回的值</returns>
public float GetConfigValueFloat(string key)
{
var v = GetConfigValue(key);
return float.Parse(v);
}
/// <summary>
/// 在配置文件中根据key取出值并转化为double类型
/// </summary>
/// <param name="key"></param>
/// <returns>返回的值</returns>
public double GetConfigValueDouble(string key)
{
var v = GetConfigValue(key);
return double.Parse(v);
}
/// <summary>
/// 在配置文件中根据key取出值并转化为DateTime类型
/// </summary>
/// <param name="key"></param>
/// <returns>返回的值</returns>
public DateTime GetConfigValueDateTime(string key)
{
var v = GetConfigValue(key);
return DateTime.Parse(v);
}
/// <summary>
/// 在配置文件中根据key取出值并转化为decimal类型
/// </summary>
/// <param name="key"></param>
/// <returns>返回的值</returns>
public decimal GetConfigValueDecimal(string key)
{
var v = GetConfigValue(key);
return decimal.Parse(v);
}
/// <summary>
/// 修改Key对应的值,如果Key不存在则添加后存入值
/// </summary>
/// <param name="key">Key</param>
/// <param name="value">要存入的值</param>
public void AddOrSetConfigValue(string key, string value)
{
AddOrSetKeyValue(configBasePath, key, value);
}
/// <summary>
/// 保存key/value键值对,对于非string类型会调用ToString()方法
/// </summary>
/// <typeparam name="T">要保存的值的类型</typeparam>
/// <param name="key">要保存的键名</param>
/// <param name="value">要保存的值</param>
public void AddOrSetConfigValue<T>(string key, T value)
{
var v = value.ToString();
AddOrSetConfigValue(key, v);
}
/// <summary>
/// 保存key/value键值对
/// </summary>
/// <param name="basePath">要保存的根节点路径</param>
/// <param name="key">要保存的键名</param>
/// <param name="value">要保存的值</param>
public void AddOrSetKeyValue(string basePath, string key, string value)
{
var doc = GetXmlDocument();
var node = doc.SelectSingleNode($"{basePath}/{key}");
if (node == null)
{
node = doc.CreateElement(key);
doc.SelectSingleNode(basePath).AppendChild(node);
}
node.InnerText = value;
doc.Save(FileName);
}
/// <summary>
/// 根据xpath获取值
/// </summary>
/// <param name="xpath">要获取的路径</param>
/// <returns>获取的值</returns>
public string GetKeyValue(string xpath)
{
var doc = GetXmlDocument();
var node = doc.SelectSingleNode(xpath);
return node?.InnerText ?? "";
}
/// <summary>
/// 删除Key以及对应的值
/// </summary>
/// <param name="key">Key</param>
public void DeleteConfigKey(string key)
{
var doc = GetXmlDocument();
var node = doc.SelectSingleNode($"{configBasePath}/{key}");
if (node == null) return;
doc.SelectSingleNode("Root/Config")?.RemoveChild(node);
doc.Save(FileName);
}
/// <summary>
/// 读取XML文档
/// </summary>
/// <returns></returns>
private XmlDocument GetXmlDocument()
{
var doc = new XmlDocument();
doc.Load(FileName);
return doc;
}
}
}
这样就把控件名,以及控件值存到本地了。
下面看看读取并直接通过控件修改控件状态;
和上面不在是一个程序了啊。
for (int i = 1; i < 5; i++)
{
//通过存入本地key得到值(key为控件名)
string name = "radio" + i;
bool b = config.GetConfigValueBool(name);
//将控件名转为Object类型
// object ch = (object)name;//和下面的代码具有一样的功能
object ch = this.GetType().GetField(name, System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.IgnoreCase).GetValue(this);
//然后转为控件类型,这样就可以直接修改控件状态
((RadioButton)ch).Checked = b;
if (b == true)
{
radio = i;
}
}
然后是通过控件名触发事件(又是一个程序,不过基本思维逻辑式样的):
//添加引用
using System.Reflection;
1.//先给btn_true创建一个click事件。
2.//将控件名转为 object,再转为button类型传入callOnClick();
public Form1()
{
InitializeComponent();
object btn = (object)"btn_true";
callOnClick(((Button)btn));
}
//这里我触发的是Click事件,具体要创建什么事件自己修改;
private void callOnClick(Button btn)
{
//建立一个类型
Type t = typeof(Button);
//参数对象
object[] p = new object[1];
//产生方法
MethodInfo m = t.GetMethod("OnClick", BindingFlags.NonPublic | BindingFlags.Instance);
//参数赋值。传入函数
p[0] = EventArgs.Empty;
//调用
m.Invoke(btn, p);
return;
}
ok,这样就基本完成。
再补充一点吧,有时候几个控件执行的代码有部分重合部分不重合我们又不想为每个控件写事件,那就只能自己写了,但是有相同又有不同我们又要分辨是哪个按钮触发;
//比如,下面几个按钮触发的都是打印,但是打印的内容有所不同,我们就可以这么写
tSDYDZ.Click += new EventHandler(btnDY_Click);//打印
tSDYSZ.Click += new EventHandler(btnDY_Click);
TSDYJH.Click += new EventHandler(btnDY_Click);
TSDYTD.Click += new EventHandler(btnDY_Click);
//打印
private void btnDY_Click(object sender, EventArgs e)
{
//获取是哪个按钮触发的事件
ToolStripButton btn = (ToolStripButton)sender;
//根据按钮名来进行区分要向哪里走~
string BtnName = btn.Name.Substring(4, 2);
/*
*/
if (BtnName == "JH" )//
{
string str = tbRWDH2.Text.Trim();
BZBDDY dy = new BZBDDY(str, strName);
dy.ShowDialog();
}
else if (BtnName == "SZ" )//
{
string str = tbRWDH1.Text.Trim();
SZDY dy = new SZDY(str, strName, checkBox4.Checked);
dy.ShowDialog();
}
else if (BtnName == "DZ")//
{
string str = tbRWDH.Text.Trim();
DZDY dy = new DZDY(str, strName, checkBox3.Checked);
dy.ShowDialog();
}
else if (BtnName == "TD" )
{
string str = txt_T_DJ.Text.Trim();
BZTDDY dy = new BZTDDY(str);
}
else
{
MessageBoxEx.Show("请确定选择的磅单,或净重是否为空!");
return;
}
}
最后再补充一点控件遍历保存
foreach (Control control in this.groupBox1.Controls)
{
if (control is RadioButton)
{
RadioButton r = (RadioButton)control;
config.AddOrSetConfigValue(r.Name, r.Checked);
}
}