Archive for the ‘东东博客’ Category

C#项目文件与源程序不在同一级目录时Resources的解决办法

星期五, 26 12 月, 2008

在多人开发的环境,可能为了同步方便把C#的项目文件.csproj移出源程序所在目录,这样在项目中使用Resources时会遇到这些麻烦(附解决办法):

1. 项目属性里Resources和Settings页会提示“This project does contain a default resources/settings file, Click here to create one.”,也就是说项目文件找不到缺省的Resources和Settings文件。

原因:因为IDE只会在项目文件所在目录的Properties子目录查找这两个信息,由于只把项目文件移出,真正的Properties目录仍在源码位置,所以IDE会提示找不到这两组资源。

解决办法:不用去管它,仍使用源码目录下的Properties,后面提到如何使用。

(更多…)

C# Array数组与ArrayList之间的互转

星期三, 24 12 月, 2008

直接看实例吧:
        private void _btnListArray_Click(object sender, EventArgs e)
        {
            string[] a = new string[3];
            a[0] = "fd";
            a[1] = "fe";
            a[2] = "4d";

            ArrayList lst = new ArrayList();
            lst.AddRange(a);

            lst.Add("ffe");
            lst.Add("rrg");
            lst[0] = "aaaa";

            string[] b = (string[])lst.ToArray(typeof(string));
        }
执行结果:a仍然是3个元素并保持不变,lst和b都是5个元素且第一个元素是“aaaa”。

相关链接:
http://www.cnblogs.com/biandande/archive/2008/12/16/1355761.html
http://www.cnblogs.com/smallfa/archive/2008/11/23/1339296.html

C#实现XML系列化和反系列化的总结

星期二, 23 12 月, 2008

常用的系列化定义(using System.Xml.Serialization;)
[XmlAttribute("name")]        // 定义<Tag name="…"></Tag>
[XmlElement("label")]        // 定义<label>…</label>
[XmlIgnoreAttribute()]        // 跳过系列化
[XmlElement("description", IsNullable = false)]        // 定义<description>…</description>,在属性值为null时不显示该元素,即可选
[XmlArray("temp_var_list", IsNullable=false)]        // 定义<temp_var_list><Tag>…</Tag>…<Tag>…</Tag></temp_var_list>,即数组对象的根结点
[XmlArrayItem("temp_var_item")]        // 定义<temp_var_item>…</temp_var_item>…<temp_var_item>…</temp_var_item>,即数据元素的根结点,常与XmlArray组合使用
[XmlRoot("dpd")]        // 定义要结点

几个注意事项
(1)需序列化的字段必须是公共的(public)
(2)需要序列化的类都必须有一个无参的构造函数
(3)枚举变量可序列化为字符串,无需用[XmlInclude]
(4)导出非基本类型对象,都必须用[XmlInclude]事先声明。该规则递归作用到子元素
 如导出ArrayList对象,若其成员是自定义的,需预包含处理:
 using System.Xml.Serialization;
 [XmlInclude(typeof(自定义类))]
(5)Attribute中的IsNullable参数若等于false,表示若元素为null则不显示该元素。
 也就是说:针对值类型(如结构体)该功能是实效的
 若数组包含了100个空间,填充了10个类对象,则序列化后只显示10个节点
 若数组包含了100个空间,填充了10个结构体对象,则序列化后会显示100个节点
(6)真正无法XML序列化的情况
 某些类就是无法XML序列化的(即使使用了[XmlInclude])
  IDictionary(如HashTable)
  System.Drawing.Color
  System.Drawing.Font
  SecurityAttribute声明
 父类对象赋予子类对象值的情况
 对象间循环引用
(7)对于无法XML序列化的对象,可考虑
 使用自定义xml序列化(实现IXmlSerializable接口)
 实现IDictionary的类,可考虑①用其它集合类替代;②用类封装之,并提供Add和this函数
 某些类型需要先经过转换,然后才能序列化为 XML。如XML序列化System.Drawing.Color,可先用ToArgb()将其转换为整数
 过于复杂的对象用xml序列化不便的话,可考虑用二进制序列化

实例
    [SerializableAttribute]        // 定义本类系列化
    [XmlRoot("dpd")]        // 定义为XML的根结点
    public class DataProcessDef

        [XmlElement("is_published")]        // 枚举类型可以系列化成字符串
        public PublishedTypes IsPublished

        [XmlElement("data_item")]        // 输出<data_item>…</data_item>
        public DataItem DataItem

        [XmlArray("property_list")]        // 组合使用,输出<property_list><property_item>…</property_item>…<property_item>…</property_item></property_list>
        [XmlArrayItem("property_item", IsNullable=false)]
        public PropertyItem[] PropertyList

        [XmlElement("custom_item", IsNullable=false)]        // 输出<custom_item>…</custom_item>…<custom_item>…</custom_item>
        public CustomItem[] CustomItems

        [XmlIgnoreAttribute()]        // 不系列化
        public String SourceName

另一种方法
namespace TestCsXml
{
    [Serializable]
    public class SubClass
    {
        public SubClass()
        {

        }

        public SubClass(String str)
        {
            _temp = str;
        }

        [XmlElement("Temp")]
        public String Temp
        {
            get
            {
                return _temp;
            }

            set
            {
                _temp = value;
            }
        }

        private String _temp;
    }

    [Serializable]
    [XmlRoot("Root")]
    [XmlInclude(typeof(SubClass))]
    public class Class1
    {
        public Class1()
        {

        }

        public Class1(String test, String name)
        {
            _test = test;
            _name = name;
        }

        [XmlElement("Test")]
        public String Test
        {
            get
            {
                return _test;
            }

            set
            {
                _test = value;
       &nbsp
;    }
        }

        [XmlAttribute("Name")]
        public String Name
        {
            get
            {
                return _name;
            }

            set
            {
                _name = value;
            }
        }

        [XmlElement("Mooo")]
        public IList Lst
        {
            get
            {
                return _list;
            }

            set
            {
                _list = value;
            }
        }

        [XmlElement("Subclass")]
        public IList Subcls
        {
            get
            {
                return _listObj;
            }

            set
            {
                _listObj = value;
            }
        }

        private String _test;
        private String _name;
        private IList _list = new List<String>();
        private IList _listObj = new List<SubClass>();
    }
}

使用方法
        private void button5_Click(object sender, EventArgs e)
        {
            FileStream fs = new FileStream(@"E:\test2.xml", FileMode.Open);
            XmlSerializer sr = new XmlSerializer(typeof(DataProcessDef));
            DataProcessDef dpd = (DataProcessDef)sr.Deserialize(fs);

            TextWriter wt = new StreamWriter(@"E:\test21.xml");
            sr = new XmlSerializer(typeof(DataProcessDef));

            sr.Serialize(wt, dpd);
            wt.Close();

            MessageBox.Show("OK");
        }
 

今天是上海今年入冬以来最高气温最低的一天

星期一, 22 12 月, 2008

随着一股冷空气的到来, 北京出现了15年以来最低的气温, 全国温度普降, 上海今天最低气温-2度最高气温才3度, 成为今年入冬以来最低的日最高气温. 刚查了一下明后天的天气情况, 温度有所回升, 但愿今天是元旦之前的最低气温, 那样可以好好迎接不一样的2009年.

刚发现粥妈出生在十一届三中全会开幕那天

星期四, 18 12 月, 2008

晚上听到新闻联播上老胡在庆祝十一届三中全会确立的改革开放三十周年, 一打听日期才发现粥妈是公历三十年前的今天出生, 她一般都是过的农历生日, 前天才过的, 所以没有注意到.

改革开放三十年到底啥样了, 咱也不好发表高论, 看看粥妈的这三十年就知道了. 哎该啥样就啥样, 日子还得过, 不过得祝老婆大人公历三十周年快乐, 但愿她后面三十年别象这过去的三十年那样.

昨天是家乡成立自治区50周年的日子,家里二楼今天开工

星期五, 12 12 月, 2008

昨天12月11日是广西壮族自治区成立50周年的日子。

近段经常听到新闻说广西要庆周年,由于常年在外打工,基本上3年左右才回一趟家,所以没怎么在意这些庆典,也不知道具体是哪一天。

昨天下班回家路上看到月亮很圆,于是查了一下农历发现昨天是农历十一月十四,知道今天早上该给家里打个电话了。因为我妈之前跟我说过今天是好日子,选今天对家里二楼做“坡改平”,就是把二楼已经用了十来年的瓦顶改成水泥板,说是二楼瓦顶经过多年的风吹雨打已经破烂不堪了,全屯只整我们家二楼还是瓦顶了。

早上起床给我爸打电话,他说今天是让包工们上工的日子而不是我之前以为的今天是铺项的日子。我爸问我们有没有放假,我说没有,他说广西搞周年庆今天放假所以他可以在家帮忙。刚才吃完中午饭上网看新闻才想到广西周年庆的问题,一查是昨天的事,不过今天还是放了一天假。

家里的二楼今天开始开工,过年回家应该都弄好了,那样就不用再有往年住二楼时室内外温度相差不大、整晚都听到寒风呼啸的日子了,粥粥小家伙有福了。

Windows注册表文件的使用技巧

星期五, 5 12 月, 2008

Windows注册表文件常用“.reg”做后缀名,使用regedit.exe导入到注册表中,通过reg文件可以实现往注册表里添加、删除、修改主键或键值,也可以删除主键或键值。

regedit.exe导入reg文件的常用命令行参数:regedit.exe /S 文件名.reg
其中“/S”参数指的是静默(Silence)安装,即不出现任何提示框,可选参数。

reg文件的格式说明
1. reg文件的第一行说明版本号,Windows 98及之前操作系统使用“REGEDIT4”表示,WIndows 2000及之后操作系统使用“Windows Registry Editor Version 5.00”,同时也兼容“REGEDIT4”。
2. 主键以左中括号“[”和右中括号“]”括起,如“[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft]”。
3. 在主键下的所有键值列属于该主键,直到文件结尾或下一个主键前结束。
4. 键值的格式是“Key=Value”,其中Key总是以半角双引号括起,Value有3种常用的类型:字符串、DWORD、BINARY。
4.1 字符串类型的Value总是以半角双引号括起,比如“"Close"="CloseTSObject"”。
4.2 DWORD类型的Value以十六进制表示并带有dword关键字,比如“"Collect Timeout"=dword:000003e8”。
4.3 BINARY类型的Value以十六进制表示并带有hex关键字,比如“"WbemAdapFileTime"=hex:00,a0,13,80,5e,3c,c6,01”。

reg文件的技巧
1. 添加主键:直接以主键格式写上即可,比如“[HKEY_CURRENT_USER\A]”表示在HKEY_CURRENT_USER下添加A主键,如果主键已经存在则忽略。
2. 添加键值:直接以键值格式写上即可,比如“"BlockXBM"=dword:00000000”表示在主键下添加BlockXBM键值,类型是DWORD,值是0,如果键值已经存在则替换。
3. 删除主键:直接以主键格式写上,并在左中括号和HKEY之间加减号“”,比如“[HKEY_CURRENT_USER\A]”表示删除HKEY_CURRENT_USER下的A主键。
4. 删除键值:直接以键值格式写上,Value的内容改为减号“”,比如“"Open"=”表示删除主键下的Open键值。
5. 修改主键的默认键值:使用“@”代替Key并省略半角双引号,即“@=Value”,Value的格式同前,Value为减号“-”表示清除默认键值。

举例:《Win2K_XP便捷右击菜单.reg》的内容
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Directory\shell\DOS Command\command]
@="\"cmd.exe\" \"%1\""

[HKEY_CLASSES_ROOT\Drive\shell\DOS Command\command]
@="\"cmd.exe\" \"%1\""

[HKEY_CLASSES_ROOT\dllfile\shell\Register\command]
@="\"regsvr32.exe\" \"%1\""

[HKEY_CLASSES_ROOT\dllfile\shell\Unregister\command]
@="\"regsvr32.exe\" /U \"%1\""

[HKEY_CLASSES_ROOT\ocxfile\shell\Register\command]
@="\"regsvr32.exe\" \"%1\""

[HKEY_CLASSES_ROOT\ocxfile\shell\Unregister\command]
@="\"regsvr32.exe\" /U \"%1\""

[HKEY_CLASSES_ROOT\Directory\shell\Attrib_out\command]
@="\"attrib.exe\" -r -h -s \"%1\\*.*\" /s"

今天起升级GPRS套餐,以后有得玩了

星期一, 1 12 月, 2008

 今年8月开始到昨天一直都用10M/5元的GPRS套餐,近段使用黑莓手机BM软件收取其它邮箱转发过来的邮件,再加上经常看新闻和博文,感觉1个月10M的流量有些吃紧,因此打算换套餐。

在用的神州行标准卡的下一个GPRS套餐是50M/20元,感觉用不完也浪费银子,而动感地带套餐有“畅游包”,只需10元就可以包25M,到今年底前还可以优惠2元。经过估算每个月的手机费,动感地带10元聊天套餐比较合适,虽然接电话不免费但送有20分钟的本地通话费。

今天起已经改成动感地带10元聊天套餐+25M/10元的GPRS畅游包,从现在起可以不用担心GPRS流量暴掉的情况了,有得玩了…

下面是上海移动的GPRS套餐表:

 

Microsoft JET Database Engine (0x80004005) 未指定错误的解决

星期一, 10 11 月, 2008

asp页面操作Access数据库如果出现Microsoft JET Database Engine (0x80004005) 未指定错误,可能是权限的问题,可以先将下面的代码复制到test.vbs,放到C:\Inetpub\wwwroot下:
Set Cat=CreateObject("ADOX.Catalog")
Cat.Create "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Inetpub\wwwroot\test.mdb"
然后用命名行窗体cmd执行test.vbs,看是不是可以创建test.mdb数据库:
C:\Inetpub\wwwroot>cscript test.vbs

如果上面的操作能创建数据库,说明是IIS指定的用户有访问限制,两个地方需要赋给这个用户的读/写权限:
1. 创建数据库文件所在的目录,这里是C:\Inetpub\wwwroot;
2. %SystemRoot%\temp目录,打开数据库时系统会在临时目录下创建临时文件。

如果test.vbs都不能创建数据,有两个可能:
1. 操作系统没有安装有Access数据库相关的组件,这个需要找到是哪些组件,安装一下再试试。
2. 当前登录用户权限不够,就此打住或找授权人员协助解决。

网站图片只能另存为BMP格式问题

星期三, 29 10 月, 2008

症状:使用IE浏览器网上“冲浪”时,想把网页上的图片保存到本地,发现图片只能另存为BMP格式。

当您右键单击网页上的某个图像,然后单击“将图片另存为”时,“文件名”框中出现的文件名是“无标题”,而“保存类型”框中出现的文件类型是“位图(*.bmp)”。即使图像使用其他格式(如 .gif 或 .jpeg),也会发生同样的情况。

原因:
1、如果所有图片都是这样,一般是因为页面缓存Temporary Internet Files 文件夹已满;需要清理Temporary Internet Files文件夹中的文件,或者调整该文件夹的大小。
2、如果是少数图片会这样,则有可能是硬盘上的SystemRoot\Downloaded Program Files 文件夹中装载了一个损坏的程序文件(例如,ActiveX 或 Java 对象)。
3、还有一个原因:有些网站服务器设置了图片防盗链,图片是以图片数据流存在sql里的,读出来也不知道是什么格式,所以会存成bmp。

以上内容来自:http://www.liuhaier.com/jiaocheng/jieda/net/200712/15278.html

如果是由于原因3引起的,则可以使用以下方法解决:
1. Firefox浏览器:直接另存成jpg文件(自己加.jpg)
2. IE浏览器:先另存成bmp再使用工具转换成jpg
3. 谷歌浏览器:直接另存成jpg文件(推荐)