vs2005,c#,winform,想运用xml作为配置文件,然后通过读取文件中的信息动态生成控件,请高手给予指导!
1、这个配置文件是要自己手写吗?格式我不清楚,不知是不是有参考资料?2、配置文件中我想放置的是需要添加的各种控件(如按钮、标签、表格等)的大小、位置、颜色、数量等信息,不...
1、这个配置文件是要自己手写吗?格式我不清楚,不知是不是有参考资料?
2、配置文件中我想放置的是需要添加的各种控件(如按钮、标签、表格等)的大小、位置、颜色、数量等信息,不知是否可行?
3、如何解析文件,整个流程是如何完成?最好给出例子
请求帮助,回答详尽的再加分~ 展开
2、配置文件中我想放置的是需要添加的各种控件(如按钮、标签、表格等)的大小、位置、颜色、数量等信息,不知是否可行?
3、如何解析文件,整个流程是如何完成?最好给出例子
请求帮助,回答详尽的再加分~ 展开
3个回答
展开全部
第1个,配置文件完全可以手写,你可以自己建立一个config文件(不一定要命名为web.config,否则你将遵循该文件自己的规范),里面只需要满足xml的基本规范就行了(顶部xml声明,下面标签成对出现).
第2个,给你个建议
<?xml version="1.0" encoding="utf-8"?>
<controls>
<control>
<size>20</size>
<position>center</position>
</control>
<control>
<size>50</size>
<position>left</position>
</control>
</controls>
第3个,怎么读取xml不知道你了解不,用到System.Xml命名空间,以第2个的例子,找到下面所有control节点,每个节点对应一个按钮..
using System;
using System.Xml;
using System.Web.UI.WebControls;
public partial class test : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
XmlDocument doc = new XmlDocument();
doc.Load(Server.MapPath("你的配置文件路径"));
XmlNodeList nol = doc.SelectNodes("/controls/control");
foreach (XmlNode no in nol)
{
Button btn = new Button();
btn.Text = no.SelectSingleNode("text").InnerText;
//以此类推
//如果需要指定Button的点击事件,则需要用到委托
btn.Click += new EventHandler(btnClick);
//将Button添加到页面,也可以是其他服务器控件
Page.Controls.Add(btn);
}
}
protected void btnClick(object sender, EventArgs e)
{
Response.Write("按钮被点击了");
}
}
另外,如果你不只创建按钮,而需要自定义控件类型,那么可能还需要用到反射,建议你可以在xml中定义一个节点<type>button</type>,<type>text</type>,用来标志类型,.只需要放入常见的一些控件类型,然后创建时做个switch判断就行了,反射效率低些而且处理也复杂
第2个,给你个建议
<?xml version="1.0" encoding="utf-8"?>
<controls>
<control>
<size>20</size>
<position>center</position>
</control>
<control>
<size>50</size>
<position>left</position>
</control>
</controls>
第3个,怎么读取xml不知道你了解不,用到System.Xml命名空间,以第2个的例子,找到下面所有control节点,每个节点对应一个按钮..
using System;
using System.Xml;
using System.Web.UI.WebControls;
public partial class test : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
XmlDocument doc = new XmlDocument();
doc.Load(Server.MapPath("你的配置文件路径"));
XmlNodeList nol = doc.SelectNodes("/controls/control");
foreach (XmlNode no in nol)
{
Button btn = new Button();
btn.Text = no.SelectSingleNode("text").InnerText;
//以此类推
//如果需要指定Button的点击事件,则需要用到委托
btn.Click += new EventHandler(btnClick);
//将Button添加到页面,也可以是其他服务器控件
Page.Controls.Add(btn);
}
}
protected void btnClick(object sender, EventArgs e)
{
Response.Write("按钮被点击了");
}
}
另外,如果你不只创建按钮,而需要自定义控件类型,那么可能还需要用到反射,建议你可以在xml中定义一个节点<type>button</type>,<type>text</type>,用来标志类型,.只需要放入常见的一些控件类型,然后创建时做个switch判断就行了,反射效率低些而且处理也复杂
展开全部
XML写入和读取配置的事件我实现过很多,运用也很简单,直接上源码。
using System;
using System.Collections.Generic;
using System.Text;
using Common.Net.Globalization;
namespace VBCommon.data
{
/// <summary>
/// Option for analytic module
/// </summary>
public class AnalyticOption
{
int _step = 2;
public int Step
{
get { return _step; }
set { _step = value; }
}
float _motionThreshold = 0.005f;
public float MotionThreshold
{
get { return _motionThreshold; }
set { _motionThreshold = value; }
}
int _cluesNumber = 3;
public int CluesNumber
{
get { return _cluesNumber; }
set { _cluesNumber = value; }
}
#region load and save
static public AnalyticOption Load()
{
AnalyticOption config = new AnalyticOption();
config = (AnalyticOption)Utilities.Deserialize(
ConfigFileName, config.GetType());
if (config == null)
{
config = new AnalyticOption();
config.Save();
}
return config;
}
public void Save()
{
Utilities.Serialize(ConfigFileName, this);
}
const string ConfigFileName = "AnalyticOption.xml";
#endregion
}
}
上面一个简单的类,类里面封装了配置以及一个Load和Save方法。Load方法是读取配置的,Save方法是保存配置的。
Load和Save里面引用的方法实现是这样的。
/// <summary>
/// Deserialize the XML file and load to data of the dataType
/// </summary>
public static object Deserialize(string file, Type dataType)
{
object data = null;
try
{
XmlSerializer serializer =
new XmlSerializer(dataType);
string full = Helpers.CombineFileName(file);
TextReader tr = new StreamReader(full);
data = serializer.Deserialize(tr);
tr.Close();
}
catch
{
// throw (e);
}
return data;
}
/// <summary>
/// Serialize data and save in the xml file
/// </summary>
public static void Serialize(string file, object data)
{
try
{
Type dataType = data.GetType();
XmlSerializer serializer =
new XmlSerializer(dataType);
TextWriter tw =
new StreamWriter(Helpers.CombineFileName(file), false, Encoding.Unicode);
serializer.Serialize(tw, data);
tw.Close();
}
catch
{
LogPrinter.WriteWithDate(string.Format("[Utilities][Serialize]保存为文件{0}时发生异常\r\n",
Helpers.CombineFileName(file)));
}
}
具体的运用如下:
需要保存文件时,如第一次启动不存在此XML文件,则需要加载默认配置,此时new一个对象,设置参数后调用对象.Save()方法,XML文件就自动生成了。
如AnalyticOption config = new AnalyticOption(); config.Step=5;config.Save();
需要读取配置时更简单:直接AnalyticOption _options = AnalyticOption.Load();就行了。
祝成功!
using System;
using System.Collections.Generic;
using System.Text;
using Common.Net.Globalization;
namespace VBCommon.data
{
/// <summary>
/// Option for analytic module
/// </summary>
public class AnalyticOption
{
int _step = 2;
public int Step
{
get { return _step; }
set { _step = value; }
}
float _motionThreshold = 0.005f;
public float MotionThreshold
{
get { return _motionThreshold; }
set { _motionThreshold = value; }
}
int _cluesNumber = 3;
public int CluesNumber
{
get { return _cluesNumber; }
set { _cluesNumber = value; }
}
#region load and save
static public AnalyticOption Load()
{
AnalyticOption config = new AnalyticOption();
config = (AnalyticOption)Utilities.Deserialize(
ConfigFileName, config.GetType());
if (config == null)
{
config = new AnalyticOption();
config.Save();
}
return config;
}
public void Save()
{
Utilities.Serialize(ConfigFileName, this);
}
const string ConfigFileName = "AnalyticOption.xml";
#endregion
}
}
上面一个简单的类,类里面封装了配置以及一个Load和Save方法。Load方法是读取配置的,Save方法是保存配置的。
Load和Save里面引用的方法实现是这样的。
/// <summary>
/// Deserialize the XML file and load to data of the dataType
/// </summary>
public static object Deserialize(string file, Type dataType)
{
object data = null;
try
{
XmlSerializer serializer =
new XmlSerializer(dataType);
string full = Helpers.CombineFileName(file);
TextReader tr = new StreamReader(full);
data = serializer.Deserialize(tr);
tr.Close();
}
catch
{
// throw (e);
}
return data;
}
/// <summary>
/// Serialize data and save in the xml file
/// </summary>
public static void Serialize(string file, object data)
{
try
{
Type dataType = data.GetType();
XmlSerializer serializer =
new XmlSerializer(dataType);
TextWriter tw =
new StreamWriter(Helpers.CombineFileName(file), false, Encoding.Unicode);
serializer.Serialize(tw, data);
tw.Close();
}
catch
{
LogPrinter.WriteWithDate(string.Format("[Utilities][Serialize]保存为文件{0}时发生异常\r\n",
Helpers.CombineFileName(file)));
}
}
具体的运用如下:
需要保存文件时,如第一次启动不存在此XML文件,则需要加载默认配置,此时new一个对象,设置参数后调用对象.Save()方法,XML文件就自动生成了。
如AnalyticOption config = new AnalyticOption(); config.Step=5;config.Save();
需要读取配置时更简单:直接AnalyticOption _options = AnalyticOption.Load();就行了。
祝成功!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
首先我可以说你这样是没必要的.
vs环境给我们提供了很好的可视化操作,你完全可以在界面中设计你想要的界面,控件你可以任意摆放,而且环境也给我们提供了大量的日常使用控件,能满足大多数开发需求.
其次,配置文件的作用是对整个应用程序进行配置,比如我们对数据库的链接字符串,如果我们写死在程序里,数据库地址变了,就需要重新编译程序,而如果写在配置文件里,可以修改配置文件,不需要重新编译程序.
最后说明一点,如果你确实还想按照你的想法做,也不是不可以,只是需要花费较大的时间和精力,个人觉得得不偿失.
如还有疑问,可咨询我.
vs环境给我们提供了很好的可视化操作,你完全可以在界面中设计你想要的界面,控件你可以任意摆放,而且环境也给我们提供了大量的日常使用控件,能满足大多数开发需求.
其次,配置文件的作用是对整个应用程序进行配置,比如我们对数据库的链接字符串,如果我们写死在程序里,数据库地址变了,就需要重新编译程序,而如果写在配置文件里,可以修改配置文件,不需要重新编译程序.
最后说明一点,如果你确实还想按照你的想法做,也不是不可以,只是需要花费较大的时间和精力,个人觉得得不偿失.
如还有疑问,可咨询我.
追问
是这样,因为无法确定控件的数量和布局,比如选择产品1,就需要3个按钮,选择产品2,就需要5个按钮,所以必须采用动态生成控件,而如果全部在代码里进行,那么需要修改的时候就必须修改代码,不方便,所以想采用读取配置文件,这样即使不是专业编程人员也可以修改。
所以现在是必须采用这样的方法,然后寻求进一步的帮助~
追答
我想你已经把问题复杂化了.
这不仅仅是配置控件的问题,如果单纯的是为界面多添加几个控件按钮,这个简单,可以参照 scheshan的回答,完全可以实现.但是,添加完控件,还要实现控件的功能,比如添加一个按钮,就需要写其单击事件,而这些控件没有统一的功能,所以程序是无法自己实现,那么这些功能怎么处理?
如果程序真的能做到简单配置后就能实现你所说的功能,那么程序员可能就不需要了,我们只需要做一个类似你说的系统,然后随便谁去配置一下,功能就出来,这不是很好么?
所以,你的想法很值得考虑,只是现在还无法实现.
建议:对产品进行分类,然后每一种类型做一个界面,然后添加产品的时候只要说明产品属于哪个类型,然后让哪个界面显示就可以了,这种思路可以帮你实现你想要的结果.
不明白可以问我.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询