自己实现的一个对窗体的资源化方法。

资源化,在vc中,是一个文件。我们只要创建对应的语言版本的资源就可以了。但不能实时的自动切换,接触也不深,还没用到需要实时切换语言的功能。前几天看到网友提问,粗略的看了一下,以为有答案,结果2天了,还挂在论坛上,回想当年自己刚工作时的辛苦,不由想写一个实现给他解救一下,呵呵。实际试了一下,还是蛮简单的。

创建一个窗体,在上面放1个Panel,Panel上放一个按钮,这是为了演示嵌套效果,然后Panel外在放2个按钮。依次添加click方法,代码如下,不足120行搞定。

using System; using System.Windows.Forms; using System.Xml; using System.Text; using System.Collections.Generic; using System.IO; using System.Xml.Serialization; namespace CSharpWin05 { public partial class Form1 : Form,IResource { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { //使用方法 /* * 软件首先把界面上所有资源都修改为同一个语言,运行起来,执行一次WindowSerialize.Serialize,保存为对应文件。 * 然后重新修改所有资源的文本为另一个语言,运行,执行一次WindowSerialize.Serialize,保存为对应文件。 * 运行时,使用WindowSerialize.Deserialize对应文件就可以实时切换了。 */ WindowSerialize.Serialize("resource_ch.xml", this); //WindowSerialize.Serialize("resource_en.xml", this); } private void button2_Click(object sender, EventArgs e) { foreach (Form form in Application.OpenForms) { IResource ir = form as IResource; if (ir == null) continue;//只针对处理过的窗体操作 WindowSerialize.Deserialize(ir.EnglishResourcePath, form); } } private void button3_Click(object sender, EventArgs e) { foreach (Form form in Application.OpenForms) { IResource ir = form as IResource; if (ir == null) continue;//只针对处理过的窗体操作 WindowSerialize.Deserialize(ir.ChineseResourcePath, form); } } private void button4_Click(object sender, EventArgs e) { new Form1().Show(); } #region IResource 成员 public string EnglishResourcePath { get { return "resource_en.xml"; } } public string ChineseResourcePath { get { return "resource_ch.xml"; } } #endregion } public interface IResource { string EnglishResourcePath { get; } string ChineseResourcePath { get; } } public static class WindowSerialize { public static void Serialize(string file, Control root) { InnerResource ir = new InnerResource(root); RecursionSerialize(ir, root); XmlSerializer xmlSerializer = new XmlSerializer(typeof(InnerResource)); TextWriter writer = new StreamWriter(file); try { xmlSerializer.Serialize(writer, ir); } finally { writer.Close(); } } public static void RecursionSerialize(InnerResource ir, Control root) { foreach (Control c in root.Controls) { InnerResource irc = new InnerResource(c); ir.Children.Add(irc); if (c.Controls.Count > 0) RecursionSerialize(irc, c); } } public static void Deserialize(string file, Control root) { XmlSerializer xmlSerializer = new XmlSerializer(typeof(InnerResource)); FileStream fs = new FileStream(file, FileMode.Open); InnerResource ir; try { ir = (InnerResource)xmlSerializer.Deserialize(fs); } finally { fs.Close(); } RecursionDeserialize(ir, root); } public static void RecursionDeserialize(InnerResource ir, Control c) { foreach (InnerResource irc in ir.Children) { if (c.Controls[irc.Name] != null) { c.Controls[irc.Name].Text = irc.Text; if (irc.Children.Count > 0) RecursionDeserialize(irc, c.Controls[irc.Name]); } } } } public class InnerResource { public string Name; public string Text; public List<InnerResource> Children = new List<InnerResource>(); public InnerResource() { } public InnerResource(string n, string t) { Name = n; Text = t; } public InnerResource(Control c) { Name = c.Name; Text = c.Text; } } }

我就喜欢贴代码。没办法,这是程序员间沟通最方便,最直接的途径了。

原理很简单,根据帖子楼主的意图,只关心text属性,那就创建一个text<-->name的树形结构,然后自动的序列化到xml,因为ini文件没有树形的结构,xml很合适。

测试项目(vs2008)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本火锅店点餐系统采用Java语言和Vue技术,框架采用SSM,搭配Mysql数据库,运行在Idea里,采用小程序模式。本火锅店点餐系统提供管理员、用户两种角色的服务。总的功能包括菜品的查询、菜品的购买、餐桌预定和订单管理。本系统可以帮助管理员更新菜品信息和管理订单信息,帮助用户实现在线的点餐方式,并可以实现餐桌预定。本系统采用成熟技术开发可以完成点餐管理的相关工作。 本系统的功能围绕用户、管理员两种权限设计。根据不同权限的不同需求设计出更符合用户要求的功能。本系统中管理员主要负责审核管理用户,发布分享新的菜品,审核用户的订餐信息和餐桌预定信息等,用户可以对需要的菜品进行购买、预定餐桌等。用户可以管理个人资料、查询菜品、在线点餐和预定餐桌、管理订单等,用户的个人资料是由管理员添加用户资料时产生,用户的订单内容由用户在购买菜品时产生,用户预定信息由用户在预定餐桌操作时产生。 本系统的功能设计为管理员、用户两部分。管理员为菜品管理、菜品分类管理、用户管理、订单管理等,用户的功能为查询菜品,在线点餐、预定餐桌、管理个人信息等。 管理员负责用户信息的删除和管理,用户的姓名和手机号都可以由管理员在此功能里看到。管理员可以对菜品的信息进行管理、审核。本功能可以实现菜品的定时更新和审核管理。本功能包括查询餐桌,也可以发布新的餐桌信息。管理员可以查询已预定的餐桌,并进行审核。管理员可以管理公告和系统的轮播图,可以安排活动。管理员可以对个人的资料进行修改和管理,管理员还可以在本功能里修改密码。管理员可以查询用户的订单,并完成菜品的安排。 当用户登录进系统后可以修改自己的资料,可以使自己信息的保持正确性。还可以修改密码。用户可以浏览所有的菜品,可以查看详细的菜品内容,也可以进行菜品的点餐。在本功能里用户可以进行点餐。用户可以浏览没有预定出去的餐桌,选择合适的餐桌可以进行预定。用户可以管理购物车里的菜品。用户可以管理自己的订单,在订单管理界面里也可以进行查询操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值