有人可以帮我一个正则表达式(或其他东西),我真的很难完成这项任务,并且无法找到任何可以帮助我完成任务的地方。
我有一个程序,用户在表单上放置一些控件。当他们点击保存按钮时,它会浏览表单上的所有控件并将其详细信息保存到文本文件中(我知道该怎么做)..就像这样:
Label
"This is text on a label"
20, 97
Tahoma, 7.5, Regular
-778225617
说明:
Control Type
Text property of that control
Location of the control
Font properties for that control
ForeColor for that control.
... 用户保存时创建的此文本文件可能只包含单个控件的信息,如上所示,甚至包含多个控件,如下所示:
Label
"This is text on a label"
20, 97
Tahoma, 7.5, Regular
-778225617
LinkLabel
"This text belongs to the linklabel text property."
Arial, 20, Bold
-119045893
说明:
Control
Text Property
Location
Font Properties
ForeColor
Control
Text Property
Location
Font Properties
ForeColor
...等......我发现这对我来说很难,因为到目前为止我还不是专家。有人能帮帮我吗?我还需要将字体属性行从字符串转换为Font对象,以便在运行时将其分配给指定控件的Font属性。
我真的很感激任何帮助。非常感谢你。
由于 松鸦
答案 0 :(得分:3)
你会做这样的事情:
using System;
using System.Drawing;
class Example
{
static void Main()
{
String fontName = "Tahoma, Regular, Size";
String[] fontNameFields = fontName.Split(',');
Font font = new Font(fontNameFields[0],
Single.Parse(fontNameFields[2]),
(FontStyle)Enum.Parse(typeof(FontStyle), fontNameFields[1]));
}
}
答案 1 :(得分:1)
您可以从文件中读取文本并将字符串拆分为数组,然后使用字体类的重载构造函数创建新的字体对象。
有关字体构造函数的列表,请参阅
尺寸参数是新字体的点的em尺寸。因此,对于其他单位的字体大小,你必须要处理它。
答案 2 :(得分:1)
这似乎是一个说得不好的问题......我看到它有几个漏洞。 (我假设你在谈论WinForms)我稍后会解决这些问题。
我不知道.NET中的任何功能都将为您完成所有这些组合解析。但是,您可以使用CSSName属性[它是一个接近此属性的属性]使用WinForms进行格式调整,并在GUI上使用CSS文件。 [有点奇怪,但它有效]
Btw表示负整数是一个有符号整数,表示以下颜色集: RGB:
255 255 255
的问题:
答案 3 :(得分:1)
为什么你没有使用XmlSerialization。你只需要创建一个内存流,然后调用它的点Save方法;然后你可以随时重新加载数据。
例如,你有一个名为Canvas的类。
继续使用Canvas.AddControls(controlTypes.Label,“这是标签上的文字”, 20,97,Tahoma,7.5,Regular,-778225617);
请参阅simplest XmlSerializer示例。
如果您不希望您的文件是xml类型的?使用二进制序列化。 See this
类似的东西:
public static void Save(object obj)
{
using (System.IO.MemoryStream stream = new System.IO.MemoryStream())
{
// Serialize an object into the storage referenced by 'stream' object.
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
// Serialize multiple objects into the stream
formatter.Serialize(stream, obj);
// If you want to put the stream into Array of byte use below code
// byte[] buffer = stream.ToArray();
}
}
答案 4 :(得分:0)
10分钟解决方案:
好的,以下是5分钟的“快速努力”,我真正的意思;我希望这能解决问题。
见下文。
第1步:画布类
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Xml.Serialization;
using System.Windows.Forms;
using System.Runtime.Serialization.Formatters.Binary;
namespace SaveControls
{
[Serializable()]
public class CCanvas
{
List<CDrawing> _listControls;
public List<CDrawing> Controls
{
get { return _listControls; }
}
public CCanvas()
{
_listControls = new List<CDrawing>();
}
public void AddControls(CDrawing theControls)
{
_listControls.Add(theControls);
}
public void ReloadControl(Form frm)
{
//foreach (CDrawing draw in _listControls) -- requires IEnumerable implementation.
for (int i = 0; i < _listControls.Count; i++)
{
CDrawing d = (CDrawing)_listControls[i];
d.Draw(frm);
}
}
public void Save()
{
try
{
using (Stream stream = File.Open("data.bin", FileMode.Create))
{
BinaryFormatter bin = new BinaryFormatter();
bin.Serialize(stream, this);
}
}
catch (IOException)
{
}
}
public CCanvas Open()
{
CCanvas LoadedObj = null;
using (Stream stream = File.Open("data.bin", FileMode.Open))
{
BinaryFormatter bin = new BinaryFormatter();
LoadedObj = (CCanvas)bin.Deserialize(stream);
}
return LoadedObj;
}
}
}
第2步:添加图纸
using System;
using System.Collections.Generic;
using System.Text;
using System;
using System.Data;
using System.Collections.Generic;
using System.Collections;
using System.IO;
using System.Xml.Serialization;
using System.Windows.Forms;
using System.Drawing;
namespace SaveControls
{
[Serializable()]
public class CDrawing
{
public enum ControlTypes { Label, TextBox, None };
private ControlTypes _controlType;
public ControlTypes ControlType
{ get { return _controlType; } }
private string _strControlText;
public string Text
{ get { return _strControlText; } }
private int _xPosition;
public int X
{ get { return _xPosition; } }
private int _yPosition;
public int Y
{ get { return _yPosition; } }
private string _strFontName;
public string Font
{ get { return _strFontName; } }
double _fFontSize;
public double Size
{ get { return _fFontSize; } }
string _strStyle;
public string Style
{ get { return _strStyle; } }
decimal _dForegroundColor;
public decimal Color
{ get { return _dForegroundColor; } }
public CDrawing(ControlTypes controlType, string strControlText, int xPosition, int yPosition,
string strFontName, double fFontSize, string strStyle, decimal dForegroundColor)
{
_controlType = controlType;
_strControlText = strControlText;
_xPosition = xPosition;
_yPosition = yPosition;
_strFontName = strFontName;
_fFontSize = fFontSize;
_strStyle = strStyle;
_dForegroundColor = dForegroundColor;
}
public void Draw(Form frm)
{
if (_controlType == ControlTypes.Label)
{
Label lbl = new Label();
lbl.Text = _strControlText;
lbl.Location = new Point(_xPosition, _yPosition);
System.Drawing.FontStyle fs = (_strStyle == System.Drawing.FontStyle.Regular.ToString()) ? System.Drawing.FontStyle.Regular : System.Drawing.FontStyle.Bold;
lbl.Font = new System.Drawing.Font(_strFontName, (float)_fFontSize, fs);
lbl.ForeColor = SystemColors.Control;// _dForegroundColor;
lbl.Visible = true;
frm.Controls.Add(lbl);
}
}
}
}
第3步:使用,序列化,保存,重新加载
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public void Save()
{
//Create a canvas object
CCanvas Canvas1 = new CCanvas();
//Add controls
Canvas1.AddControls(new CDrawing(CDrawing.ControlTypes.Label, "This is text on a label1", 10, 100, "Tahoma", 7.5, "Regular", -778225617));
Canvas1.AddControls(new CDrawing(CDrawing.ControlTypes.Label, "This is text on a label11", 20, 200, "Verdana", 7.5, "Regular", -778225617));
Canvas1.AddControls(new CDrawing(CDrawing.ControlTypes.Label, "This is text on a label111", 30, 300, "Times New Roman", 7.5, "Regular", -778225617));
//Save the object
Canvas1.Save();
}
private void button1_Click(object sender, EventArgs e)
{
Save();
}
private void btnLoad_Click(object sender, EventArgs e)
{
Load();
}
public void Load()
{
//Retrieve
CCanvas Canvas2 = new CCanvas();
//opens the binary file
Canvas2 = Canvas2.Open();
//loads control to this form.
Canvas2.ReloadControl(this);
}
}
如果您打算讨厌此解决方案,请告诉我们原因。同时我正在寻找上传的地方。 Googlecode,但我没有安装subversion客户端。 :0(
答案 5 :(得分:-1)
这对你有用吗?
Font font = new Font("Tahoma",12,FontStyle.Regular);