所以我有這個代碼的權利,它基本上讀取一個XML文件,並做了一些如果檢查一些事情,然後將適當的控件放置在畫布(面板)上。這樣做更優雅/有效嗎? (XML/Linq /讀寫)
但它很長。或者,比我想要的要長。而這個代碼就像......現在2或3歲。
我想要做的是使用Linq to XML。
從XML文件讀取:
OpenFileDialog o = new OpenFileDialog();
o.Filter =
"wordreplaced Multimedia Format (*.mf)|*.mf|" +
"Word Document (*.docx)|*.docx|" +
"PDF Document (*.pdf)|*.pdf|" +
"Text FIle (*.txt)|*.txt";
o.Title = "wordreplaced 11 - Open Document";
using (o)
{
if (o.ShowDialog() == DialogResult.OK)
{
foreach (var controlTag in XDocument.Load(o.FileName).Root.Elements())
{
var controlType = Type.GetType(
string.Format(
"System.Windows.Forms.{0}, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089",
controlTag.Name.LocalName), false);
if (controlType == null || !typeof(Control).IsAssignableFrom(controlType))
{
continue;
}
var control = (Control)Activator.CreateInstance(controlType);
control.Text = controlTag.Attributes("Content").First().Value;
try
{
control.ForeColor = Color.FromArgb(
int.Parse(controlTag.Attributes("A").First().Value),
int.Parse(controlTag.Attributes("R").First().Value),
int.Parse(controlTag.Attributes("G").First().Value),
int.Parse(controlTag.Attributes("B").First().Value));
Font font = FromString(controlTag.Attributes("Font").First().Value);
control.Font = font;
}
catch { continue; }
control.BackColor = Color.Transparent;
control.MouseDown += new MouseEventHandler(control_MouseDown);
control.MouseMove += new MouseEventHandler(control_MouseMove);
control.MouseUp += new MouseEventHandler(control_MouseUp);
control.MouseClick += new MouseEventHandler(control_MouseClick);
control.MouseDoubleClick += new MouseEventHandler(control_MouseDoubleClick);
string boldness = Convert.ToString(controlTag.Attributes("Bold"));
if (boldness == "yeah")
control.Font = new Font(control.Font.Name, control.Font.Size, FontStyle.Bold);
Type t = control.GetType();
if (t.Name == "Label")
{
Label label = (Label)control;
label.AutoSize = true;
label.Location = new Point(
Convert.ToInt32(controlTag.Attributes("LocationX").First().Value),
Convert.ToInt32(controlTag.Attributes("LocationY").First().Value));
Canvas.Controls.Add(label);
// handlers.
label.MouseDown += new MouseEventHandler(label_MouseDown);
label.MouseMove += new MouseEventHandler(label_MouseMove);
label.MouseUp += new MouseEventHandler(label_MouseUp);
label.MouseClick += new MouseEventHandler(label_MouseClick);
label.MouseDoubleClick += new MouseEventHandler(label_MouseDoubleClick);
}
else if (t.Name == "LinkLabel")
{
control.Tag = controlTag.Attributes("Address").First().Value;
LinkLabel link = (LinkLabel)control;
link.AutoSize = true;
link.Location = new Point(
Convert.ToInt32(controlTag.Attributes("LocationX").First().Value),
Convert.ToInt32(controlTag.Attributes("LocationY").First().Value));
if (boldness == "yeah")
control.Font = new Font(control.Font.Name, control.Font.Size, FontStyle.Bold);
link.LinkColor = Color.White;
Canvas.Controls.Add(link);
// Add handlers.
link.MouseDown += new MouseEventHandler(link_MouseDown);
link.MouseMove += new MouseEventHandler(link_MouseMove);
link.MouseUp += new MouseEventHandler(link_MouseUp);
link.MouseClick += new MouseEventHandler(link_MouseClick);
link.MouseDoubleClick += new MouseEventHandler(link_MouseDoubleClick);
}
else if (t.Name == "PictureBox")
{
PictureBox p = (PictureBox)control;
p.Image = Base64ToImage(controlTag.Attributes("Content").First().Value);
p.AutoSize = true;
p.Location = new Point(
Convert.ToInt32(controlTag.Attributes("LocationX").First().Value),
Convert.ToInt32(controlTag.Attributes("LocationY").First().Value));
Canvas.Controls.Add(p);
// Add handlers.
p.MouseDown += new MouseEventHandler(p_MouseDown);
p.MouseMove += new MouseEventHandler(p_MouseMove);
p.MouseUp += new MouseEventHandler(p_MouseUp);
p.MouseClick += new MouseEventHandler(p_MouseClick);
p.MouseDoubleClick += new MouseEventHandler(p_MouseDoubleClick);
}
}
this.Text = "wordreplaced 11 - " + o.FileName;
}
}
寫XML文件:
SaveFileDialog s = new SaveFileDialog();
s.Filter =
"wordReplaced Multimedia Format (*.mf)|*.mf|" +
"Word Document (*.docx)|*.docx|" +
"PDF Document (*.pdf)|*.pdf|" +
"Text FIle (*.txt)|*.txt";
s.Title = "wordReplaced 11 - Save Document";
s.CheckFileExists =
false;
XElement d;
using (s)
{
if (s.ShowDialog() == DialogResult.OK)
{
if (File.Exists(s.FileName))
d = XElement.Load(s.FileName);
else
d = new XElement("cs");
foreach (Control control in Canvas.Controls)
{
Type t = control.GetType();
switch (t.Name)
{
case "JTS.TextBox":
XElement xe0 = new XElement("JTS.TextBox",
new XAttribute("Content", control.Text),
new XAttribute("LocationX", control.Location.X),
new XAttribute("LocationY", control.Location.Y),
new XAttribute("A", control.ForeColor.A),
new XAttribute("R", control.ForeColor.R),
new XAttribute("G", control.ForeColor.G),
new XAttribute("B", control.ForeColor.B),
new XAttribute("Font", control.Font),
new XAttribute("Bold", "yeah"));
d.Add(xe0);
break;
case "LinkLabel":
LinkLabel ll = (LinkLabel)control;
try
{
XElement xe1 = new XElement("LinkLabel",
new XAttribute("Content", control.Text),
new XAttribute("LocationX", control.Location.X),
new XAttribute("LocationY", control.Location.Y),
new XAttribute("A", ll.LinkColor.A),
new XAttribute("R", ll.LinkColor.R),
new XAttribute("G", ll.LinkColor.G),
new XAttribute("B", ll.LinkColor.B),
new XAttribute("Font", ll.Font),
new XAttribute("Address", control.Tag),
new XAttribute("Bold", "yeah"));
d.Add(xe1);
}
catch
{
XElement xe1 = new XElement("LinkLabel",
new XAttribute("Content", control.Text),
new XAttribute("LocationX", control.Location.X),
new XAttribute("LocationY", control.Location.Y),
new XAttribute("A", ll.LinkColor.A),
new XAttribute("R", ll.LinkColor.R),
new XAttribute("G", ll.LinkColor.G),
new XAttribute("B", ll.LinkColor.B),
new XAttribute("Font", ll.Font),
new XAttribute("Bold", "yeah"));
d.Add(xe1);
}
break;
case "PictureBox":
PictureBox px = (PictureBox)control;
string ie = ImageToBase64(px.InitialImage, System.Drawing.Imaging.ImageFormat.Bmp);
XElement xe2 = new XElement("PictureBox",
new XAttribute("Content", ie),
new XAttribute("LocationX", px.Location.X),
new XAttribute("LocationY", px.Location.Y));
d.Add(xe2);
break;
default:
break;
}
d.Save(s.FileName);
FilePath = s.FileName;
Text = s.FileName;
ds = true;
}
}
}
工作正常。它沒有一個單一的問題。但是,試圖擴展/處理等問題只是一團糟。我需要一種更高效/更清潔/更優雅的方式來寫入XML文件,並從XML文件中讀取數據並對它們執行linq查詢。
我讀過一些教程和一篇文章,但我並沒有完全理解它。一個網站提到了一個StreamWriter,它沒有任何意義,似乎有很多不同的方式來用Linq寫入/讀取XML文件,這對我來說都非常混亂。
在所有的任何幫助是極大的讚賞,
謝謝
你不是已經在使用LINQ to XML嗎? XDocument在System.Xml中。 ** Linq **程序集。 – alex 2011-05-16 05:18:42
是的,但它與我見過的其他一切完全不同。這是如此龐大/醜陋/長 – 2011-05-16 05:23:01
這是完全不同的問題。你想要的是重構你的代碼,而不是使用不同的技術;不要使用更大的錘子,改變使用方式。 – alex 2011-05-16 05:25:49