Jul 19

 把C#中的类用序列化保存/取出到XML文件,是很方便的事。

1. 要using命名空间:

C# Code Copy Code To Clipboard
  1. using System.Xml;  
  2. using System.Xml.Serialization;  
  3. using System.Runtime.Serialization;  

2. 要在类前加序列化标记,包括每个被成员类,都要加上:

C# Code Copy Code To Clipboard
  1. [Serializable]  
  2. [XmlRoot("UnitSystem")]  
  3. public class UnitSystem   
  4. {  
  5.     。。。。  
  6. }  

3. 需要保存的类的变量,包括子类中的变量,前面加上标记:

C# Code Copy Code To Clipboard
  1. 。。。  
  2. public class TUnitItem  
  3. {  
  4.     [XmlAttribute(AttributeName = "ParaA")]  
  5.     public double A;  
  6.     [XmlAttribute(AttributeName = "ParaB")]  
  7.     public double B;  
  8.     。。。  
  9. }  

4. 如果要保存的变量,是数组形式,加上如下标记:

C# Code Copy Code To Clipboard
  1. [XmlArray("Units")]  
  2. [XmlArrayItem("Unit")]  
  3. public List<TUnitItem> Units;  

5. 确保每个类,都有一个不带参数的构造方法:

C# Code Copy Code To Clipboard
  1. //这个实际上没用,只是为了序列化而建  
  2. public TUnitItem()  
  3. {  
  4.     UnitStr = "";  
  5.     A = 1;  
  6.     B = 0;  
  7. }  
  8. //这个才是真正用来构造类的  
  9. public TUnitItem(string Unitstr, double a, double b = 0)  
  10. {  
  11.     UnitStr = Unitstr;  
  12.     A = a;  
  13.     B = b;  
  14. }  

6. 然后,在你的类里,添加下面的函数用来保存、读取吧,我这里的类名是UnitSystem,改成你自己的即可:

C# Code Copy Code To Clipboard
  1. public void Save(string filename)  
  2. {  
  3.     System.IO.StreamWriter writer = new System.IO.StreamWriter(filename, false, System.Text.Encoding.UTF8);  
  4.     XmlSerializer ser = new XmlSerializer(GetType());  
  5.     ser.Serialize(writer, this);  
  6.     writer.Close();  
  7. }  
  8.   
  9. public void Load(string filename)  
  10. {  
  11.     System.IO.StreamReader reader = new System.IO.StreamReader(filename);  
  12.     XmlSerializer ser = new XmlSerializer(typeof(dbrcomponent));  
  13.     UnitSystem result = (UnitSystem)ser.Deserialize(reader);  
  14.     reader.Close();  
  15.     return result;  
  16. }  

 

 

Tags: , , ,
Jul 17

4年前用VS2005的C#编写了一个应用程序,用于调试VC++写的AMINE计算包。自从发布出去以后,就已经很久没有用过了。这两天有要求要重新改良一下这个软件,于是把这个程序移植到了VS2010,在Windows 7 64bit下重新编译通过,但是当运行case时,却发现出问题了。

界面每次调用DLL中的amDBRInitialize()进行初始化时,就报错。试了一下放在我的VM下的32bit的WIN7,XP下,也都会出这问题。但是在别人的windows XP下就是好的,在我另一台XP下也是好的。更奇怪的时,用以前vs2005编译的界面和DLL,也都存在同样的问题。

还好VS下抓错误信息很方便,错误为An attempt was made to load a program with an incorrect format.

查找后发现,这还是因为x86和x64兼容性的问题。因为dll是32位编译的,而编译界面时,无论以前的VS2005还是现在的VS2010,用的都是any cpu,结果在此64位计算机上,就出现了调用不谐调--64位的程序调用32位的DLL。所以,在VS2010上,把编译指令从ANY CPU改成X86就能解决问题。

修改以后,错误消失,这个问题算是解决了。但是奇怪的是,为什么之前在VM的32位的OS也一样不行呢?

Tags: , , , , , ,
Mar 21

有需要在messageBox中增加一些内容,比如说,显示一些超链接,显示一个复选框.可是.NET原配的MESSAGEBOX扩展功能有限,找了半天资料也找不到在其基础上的扩展,所以只能自己制作一个了.

今天说第一项.

要在MessageBox中显示含有超链接的文本,最合适的控件是LinkLabel,之前也试过其他的控件,都有问题,比如:

1. RichText,这个只能用来显示RTF格式的文本,即格式化文本,如果要设置字体大小颜色加入图片,用这个合适,但是要内嵌超链接,这个没办法

2. WebBrowser,这个用来显示HTML文件相当好,但是一来我要显示的只是一些小块的文本,没必要用这个大家伙,二来我需要单起一个线程,而WebBrowser不能用在非主线程里.

开始时以为LinkLabel只能显示一个超链接,所以没仔细研究,后来才发现这东东其实威力不小,经过处理能显示带多个超链接的文本,很适合我的需要.

下面的代码是把传入的HTML格式的文本(超链接以<a href="...">XXX</a>格式存在)经过分析后转成LabelLink的方式显示出来.刚写的东西,BUG肯定有,请谅解.

1. 在建立FORM时,新建一个LinkLabel,设置其基本属性如下:

C# Code Copy Code To Clipboard
  1. frmMessage = new LinkLabel();
  2. frmMessage.LinkClicked += new LinkLabelLinkClickedEventHandler(frmMessage_LinkClicked);
  3. frmMessage.Dock = System.Windows.Forms.DockStyle.Top;
  4. frmMessage.AutoSize = true;
  5. frmMessage.Font = new Font("Tahoma", 9, FontStyle.Regular);

2. 注意第2行,在新建LinkLabel时,用户点击内容中的超链接时的响应也需要自行定义.在此,我用System.Diagnostics.Process.Start(target)来启动系统默认的浏览器来查看超链接,不必在其中指定IEXPLORER等.

C# Code Copy Code To Clipboard
  1. static void frmMessage_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
  2. {
  3. string target = e.Link.LinkData as string;
  4. if (target != null)
  5. {
  6. System.Diagnostics.Process.Start(target);
  7. }
  8. }

3. 那LinkLabel中的内容如何生成呢?我这里是基于从某个固定网页上实时取下来的HTML格式的文本,所以要对这段取下的文本做一点HTML解释才能放到LinkLabel上.

C# Code Copy Code To Clipboard
  1. static private void buildlink(string Message)
  2. {
  3. string sTmpMsg = Message = Message.Replace("<br>", "n").Replace(" ", " ").Replace("&", "&").Replace("<", "<").Replace(">", ">").Replace(""", @"""").Replace("#39;", "'").Replace("&", "&&");
  4. List<string> lLinks = new List<string>();
  5. Regex rWholeLink = new Regex(@"<a href=[wW]+?</a>", RegexOptions.IgnoreCase);
  6. Match mWholeLink = rWholeLink.Match(Message);
  7. if (!mWholeLink.Success)
  8.  
  9. {
  10. frmMessage.Text=Message;
  11. frmMessage.DisabledLinkColor = Color.Black;
  12. frmMessage.LinkBehavior = LinkBehavior.NeverUnderline;
  13. frmMessage.Links[0].Enabled = false;
  14. return;
  15. }
  16.  
  17.  
  18. while (mWholeLink.Success)
  19. {
  20. Regex rLink = new Regex(@"<a href=""[wW]+?"">", RegexOptions.IgnoreCase);
  21. Regex rText = new Regex(@">[wW]+?</a>", RegexOptions.IgnoreCase);
  22. Match mLink = rLink.Match(mWholeLink.Value.ToString());
  23. if (mLink.Success)
  24. {
  25.  
  26. Match mText = rText.Match(mWholeLink.Value.ToString(), mLink.Index);
  27. if (mText.Success)
  28. {
  29. string sLink = mLink.Value.ToString(); sLink = sLink.Substring(9, sLink.Length - 11).Replace("&&", "&");
  30. string sText = mText.Value.ToString(); sText = sText.Substring(1, sText.Length - 5);
  31. lLinks.Add(sLink + "#|||#" + sText);
  32. sTmpMsg = rWholeLink.Replace(sTmpMsg, sText, 1);
  33. }
  34. }
  35. mWholeLink = mWholeLink.NextMatch();
  36. }
  37. frmMessage.Text = sTmpMsg;
  38. foreach (string s in lLinks)
  39. {
  40. try
  41. {
  42. string slink = s.Substring(0, s.IndexOf("#|||#"));
  43. string stext = s.Substring(s.IndexOf("#|||#") + 5, s.Length - s.IndexOf("#|||#") - 5);
  44. frmMessage.Links.Add(frmMessage.Text.IndexOf(stext), stext.Length, slink);
  45. }
  46. catch
  47. {
  48. }
  49. }
  50. newMessageBox.Height = frmMessage.Height + 100;
  51. }

这段代码粘贴上来有点乱,不知为什么总是无法使用C#格式放上来,只能如此了。总而言之其作用是把带<a href="...">XXX</a>超链接格式的文本转换成普通文本,并按LinkLabel的使用方式在其中添加Links[]。

稍后继续。。。

Mar 18
C# Code Copy Code To Clipboard
  1. Thread myThread = new Thread(new ThreadStart(delegate { myThreadAction(Param1, Param2, Param3); }));   
      
  2. myThread.Start();   

很简单吧

Tags: , ,
Mar 9

都是时间惹的祸 不指定

kcao , 11:59 , 技术 , 评论(0) , 引用(0) , 阅读(1610) , Via 本站原创

这程序在我这儿一切都运行得好好地,但是一换到DOUG那儿就有问题.迟迟解决不了.原来的程序没写LOG,现在加上去了一看才知道,原来是GB的时间格式和我这儿不一样,原来用的DATETIME.PARSE在他那儿就过不去了.

改成用ParseExact加上格式限制就好了,代码如下:

C# Code Copy Code To Clipboard
  1. DateTime.ParseExact("12/30/1899","M/d/yyyy",null);  

程序里有好几处类似的地方,要注意全部改到.

另外增加了LOG类,用来输出日志消息.

Tags: , ,
分页: 2/6 第一页 上页 1 2 3 4 5 6 下页 最后页 [ 显示模式: 摘要 | 列表 ]