火木棉

木棉道 . 不积硅步 无以至千里
随笔 - 15, 文章 - 6, 评论 - 19, 引用 - 4
数据加载中……

2008年8月29日

c#中 uint--byte[]--char[]--string相互转换汇总

 

uint-----byte[]-----char[]-----string

 

        在在做一些互操作的时候往往需要一些类型的相互转换,比如用c#访问win32api的时候往往需要向api中传入DWORD参数 即:uint参数这些数值所表示的数据在实际的应用中可能需要以字符的形式显示,但是c#对api的关系无法跟c++相比,所以在c#中进行一些类型数据的转换十分必要了,
    下面将用到的一些简单的转换操作贴上来,方便记忆 
     

uint--->byte[]

       byte[] bpara  =System.BitConverter.GetBytes(uint upara);

 

byte[]--->uint

       uint upara= System.BitConverter.ToUint32(bpara);

 

byte--->char

       system.convert.tochar(bpara);

 

char--->byte

       system.convert.tobyte(cpara);

 

byte[]--->char[]

      (1)char[] cpara= System.Text.Encoding.Default.GetChars(bpara);(1)

(2)char[] cpara=new char[bpara.length];

for(int i=0;i <bpara.length;i ++){char[i]=system.convert.tochar(bpara[i]);}    

 

char[]--->byte[]

      byte[] bpara= System.Text.Encoding.Default.GetBytes(cpara);    

            

char[]--->string

      String spara=new String(cpara);

 

string---char[]

     char[] cpara=spara.ToCharArray()

   

uint---->char[]

      (1)uint-->byte[];

      (2)byte[]-->char[];   

            

uint--->string

     (1)uint-->byte[];

     (2)byte[]-->char[];

     (3)char[]-->string;

 

byte[]--->string

    (1).byte[]-->char[];

    (2).char[]-->string;

 

char[]--->uint

   (1).char[]-->byte[];

   (2).byte[]-->uint;

 

string--->byte[]

    bpara= System.Text.Encoding.Default.GetBytes(sPara)

 

string--->uint

     (1)string-->byte[];

     (2)byte[]-->uint;

   

    注意在跟api用uint进行字符交互的时候,一定要注意字符顺序,涉及到api中高低位数据的问题,即获取到api中DOWRD的数据在c#表示中往往是反序,所以在c#中获取或者传递字符串时一定要注意反序处理后才能转换成uint给api使用,有机会好好总结一下贴上来。    

 

posted @ 2008-08-29 13:43 火木棉 阅读(183) | 评论 (0)编辑

2008年5月19日

孩子 快抓紧妈妈的手

孩子  快抓紧妈妈的手
     ——为地震死去的孩子们而作
    
    孩子,快
    
    抓紧妈妈的手
    
    去天堂的路
    
    太黑了
    
    妈妈怕你
    
    碰了头
    
    快
    
    抓紧妈妈的手
    
    让妈妈陪你走
    
    妈妈怕天堂的路太黑
    
    我看不见你的手
    
    自从倒塌的墙
    
    把阳光夺走
    
    我再也看不见你柔情的眸
    
    孩子
    
    你走吧
    
    前面的路
    
    再也没有忧愁
    
    没有读不完的课本
    
    和爸爸的拳头
    
    你要记住
    
    我和爸爸的模样
    
    来生还要一起走
    
    妈妈
    
    别担忧
    
    天堂的路有些挤
    
    有很多同学朋友
    
    我们说
    
    不哭
    
    哪一个人的妈妈都是我们的妈妈
    
    妈妈
    
    哪一个孩子都是妈妈的孩子
    
    没有我的日子
    
    你把爱给活的孩子吧
    
    妈妈
    
    妈妈
    
    你别哭
    
    泪光照亮不了
    
    我们的路
    
    让我们自己
    
    慢慢德走
    
    妈妈
    
    我会记住你和爸爸的模样
    
    记住我们的约定
    
    来生一起走!

posted @ 2008-05-19 19:03 火木棉 阅读(62) | 评论 (0)编辑

2008年5月16日

qq群里流传的童谣

童谣
 
今年的雪,特别的大,
爸爸还有妈妈,回不了家。

有群坏人,来把人吓,
烧了我的学校,砸我的花。

那个喇嘛,叽里呱啦,
长鼻子的洋人,假装眼瞎。

巴黎铁塔,伦敦警察,
抱火炬的姐姐,人见人夸。

汽笛嘟嘟,铁轨哗哗,
去天堂的列车,还没到达。

龙又翻身,大地垮塌,
教室的瓦砾下,埋了童话。

重重的墙,将老师压,
我们在他身下,都很听话。

没过很久,听到喇叭,
外面有个爷爷,叫我别怕。

叔叔的手,使劲地挖,
解放军的飞机,送我回家。

经过灾难,我已长大,
永远不会忘记,二零零八...
温总理说过:
一个很小的问题,乘以13亿,都会变成一个大问题;
一个很大的总量,除以13亿,都会变成一个小数目。
现在我们要说:
一点很小的善心,乘以13亿,都会变成爱的海洋;
一个很大的困难,除以13亿,都会变得微不足道。

posted @ 2008-05-16 09:15 火木棉 阅读(32) | 评论 (0)编辑

2008年3月22日

WINFORM 多条件动态查询 通用代码的设计与实现

     摘要: 经常碰到多条件联合查询的问题,以前的习惯认为很简单总会从头开始设计布局代码,往往一个查询面要费上老半天的功夫,而效果也不咋地。    前段时间做了个相对通用的多条件动态查询面,复用起来还是挺方便的,放上来共参考指导 。 供下载的源文件链接 : 多条件动态查询通用模板下载 主要的运行后布局:      主要的通用功能和要求: 主要的方法体:     动态的显示查询条件: 1//初始化联合查询的页面... 阅读全文

posted @ 2008-03-22 12:43 火木棉 阅读(253) | 评论 (1)编辑

2008年3月15日

winform 下 从DataGridView 的 DataGridViewCheckBoxCell 列取值和保存问题

   
    当DataGridView 的 DataGridViewCheckBoxCell 列处于编辑模式下的时候,我们编辑后用Value或者FormatedValue取值得时候往往会出现取出的是编辑之前的数据 只是因为DataGridView 并未提交修改记录,如果疏忽的时候往往会出现错误 ,特别是在处理用户权限的时候,很多的权值保存不上,仔细看看也许并不是数据库操作问题,而是刚开始取值得时候就出现了问题。
    这种问题往往在用Value 或者FormattedValue取值时出现 针对这种问题有很多种解决办法是:
    如果习惯用Value 或者FormattedValue取值得话,先要在处理事件中用this .dataGridView1 .EndEdit ();方法强制提交编辑完成的数据
    另外更简单的方法是直接用 EditedFormattedValue取值,这样无论数据时候提交,取出的一定是编辑后的数据。

posted @ 2008-03-15 17:20 火木棉 阅读(509) | 评论 (2)编辑

2008年3月14日

如何在winform的 DataGridView 中捕捉 CheckBox ( DataGridViewCheckBoxCell ) 列的状态改变



    如果需要在winform 的数据控件datagridview 中嵌入checkbox列 (  DataGridViewCheckBoxCell ),

在程序的执行中有可能需要像纯粹的checkbox控件的selectedindexchanged事件一样的事件来捕捉其状态的改变

我觉得比较好的方式是用datagridview 控件的cellcontentclick事件   例如:

如果嵌入的 DataGridViewCheckBoxCell 列在第一列,判断状态并添加处理事件可以为:

  private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {

            if (e.ColumnIndex == 0 && e .RowIndex != -1)
            {

                     //获取控件的值

                    MessageBox.Show(this.dataGridView1.Rows[e.RowIndex].Cells[0].EditedFormattedValue.ToString());

                //或者可以做其他事件处理程序

            }

}

需要注意的是执行此事件是需要屏蔽其他datagridview单元格的cellcontentclick事件 ,即让除了 DataGridViewCheckBoxCell 列之外的所有列的ReadOnly=True;


  在获取datagridview中checkbox列的值得时候 一定要用 EditedFormattedValue属性,此属性获取的是编辑以后数值 而value 和FormattedValue返回的往往是编辑以前的数值,而其重复单击的时候往往会出现错误(无法确定是编辑前还是编辑后的数值: 主要原因是焦点问题,需要先移动焦点使datagridview获取更改后的数据在区获取他 就没有问题了,所以以后用去获取数据前先要移出datagridview中的焦点!!!),所以一定要用EditedFormattedValue来获取属性值

posted @ 2008-03-14 18:12 火木棉 阅读(1075) | 评论 (1)编辑

2007年12月7日

深入研究Asp.net页面的生命周期

介绍
Asp.net是微软.Net战略的一个组成部分。它相对以前的Asp有了很大的发展,引入了许多的新机制。本文就Asp.net页面的生命周期向大家做一个初步的介绍,以期能起到指导大家更好、更灵活地操纵Asp.net的作用。
当一个获取网页的请求(可能是通过用户提交完成的,也可能是通过超链接完成的)被发送到Web服务器后,这个页面就会接着运行从创建到处理完成的一系列事件。在我们试图建立Asp.net页面的时候,这个执行周期是不必去考虑的,那样只会自讨苦吃。然而,如果被正确的操纵,一个页面的执行周期将是一道有效而且功能强大的工具。许多开发者在编写Asp.net的页面以及用户控件的时候发现,如果知道整个过程中发生了什么以及在什么时候发生将对完成整个任务起到很重要的帮助作用。下面我就向大家介绍一下一个Asp.net页面从创建到处理完成过程中的十个事件。同时,也向大家展示如何在这些事件中添加自己的代码以达到预定的效果。
一.初始化对象
一个页面的控件(以及页面本身)最初应被正确的初始化。通过在你的C#文件的构造函数中声名所有对象(如图1),页面就知道要创建多少对象以及它们的类型。一旦你在你的构造函数中声名了所有的对象,你就可以通过继承类、方法、事件或是属性访问它们。然而,如果你的一些对象是在Aspx文件中指定的一些控件,那么这些控件就没有属性可言了。同时,通过代码访问它们会产生一些意外的错误,因为这些控件实例是没有一个确定的创建顺序的(如果它们是被一起创建的)。还有,你可以通过OnInit来重载初始化事件,图示如下(图1):

图1

二.导入Viewstate数据
在初始化事件后,所有控件只可以通过它们的ID被引用访问(因为还没有相应的DOM可使用)。在LoadViewState这个事件中,所有的控件将获得它们的第一个属性:Viewstate属性。这个属性最终将被返回给服务器以判断这个页面是已经被用户访问完毕还是仍然在被用户所访问。Viewstate属性以“名称/值”对的字符串方式被保存,它包含了控件的文本以及值等信息。该属性被存储在一个隐藏的<input>控件的值属性里,在请求页面时被传递。这种方式比起Asp3.0的维持、判断页面状态的方式有了很大的进步啊。还有,你可以重载LoadViewState事件函数来对相应的控件进行值设定。下图(图2)是一个例子:

图2

三.用LoadPostData处理Postback数据
在页面创建的这个阶段,服务器对页面上的控件提交的表单数据(在Asp.net中称postback数据)进行处理。当一个页面提交一个表单时,框架就在每个提交了数据的控件上执行一个IPostBackDataHandler接口操作。然后页面执行LoadPostData事件,解析页面,找到每个执行了IpostBackDataHandler接口操作的控件,并用恰当的postback数据更新这些控件状态。Asp.net是通过用NameValue集中的“名称/值”对和每个控件的唯一的ID匹配来实现这一操作的。所以,在Asp.net的页面上每个控件必须有一个唯一的ID,不可以出现几个控件共有ID的情况。即使是用户自定义的一些控件,框架也会赋予它们各自唯一的ID的。在LoadPostData事件后,就要执行下面的RaisePostDataChanged事件了。
四.导入对象
在Load事件中,对象都实例化了。所有的对象第一次被布置在DOM页面(在Asp.net中称控件树)里了并且可以通过代码或是相关的位置被引用。这样,对象就可以很容易的从客户端获得诸如宽度、高度、值、可见性等在Html中的属性值。在Load事件中,当然还有像设置控件属性等操作的发生。这个过程是整个生命周期中最重要、最主要的,你可以通过调用OnLoad来重载Load事件,图示如下(图3):

图3

五.RaisePostBackChanged事件
就像在上面提到的那样,这个事件是发生在所有的控件执行了IPostBackDataHandler接口操作并被正确的postback数据更新后的。在这个过程中,每个控件都被赋予一个布尔值来标志该控件有没有被更新。然后,Asp.net就在整个页面上寻找任何已被更新过的控件并执行RaisePostDataChanged事件操作。不过,这个事件是要在所有的控件都被更新了以及Load事件完成后才进行的。这样就保证了一个控件在被postback数据更新前,别的控件在RaisePostDataChanged事件中是不会被手动改变的。
六.处理客户端PostBack事件
当由postback数据在服务器端引起的事件都完成后,产生postback数据的对象就执行RaisePostBackEvent事件操作。可是会有这种情况,由于一个控件状态的改变使得它将表单返回给服务器或是用户点击了提交按钮使得表单返回给服务器。在这种情况下应该有相应的处理代码来体现事件驱动这一面向对象(OOP)编程原则。由于要满足呈现给浏览器的数据的精确性要求,在一系列postback事件中RaisePostBackEvent事件是最后发生的。
在postback过程中改变的控件不应在执行功能函数被调用后更新。也就是说,任何由于一个预期的事件而改变的数据应该在最终的页面上被反映出来。你可以通过修改RaisePostBackEvent函数来满足你的要求,图示如下(图4):

图4

七.预先呈递对象
可以改变对象并将改变保存的最后时刻就是这一步――预先呈递对象。这样,你可以在这一步对控件的属性、控件树结构等作出最后的修改。同时还不用考虑Asp.net对其作出任何改变,因为此时已经脱离了数据库调用以及viewstate更新了。在这一步之后,对对象的所有修改将最终被确定,不能被保存到页面的viewstate中了。你可以通过OnPreRender来重载这一步。
八.保存ViewState
所有对页面控件的修改完成后viewstate就被保存了。对像的状态数据还是保留在隐藏的<input>控件里面,呈现给Html的对象状态数据也是从这里取得的。在SaveViewState事件中,其值能被保存到viewstate对象,然而这时在页面上控件的修改却不能了。你可以用SaveViewState来重载这一步,图示如下(图5):

图5

九.呈递给Html
运用Html创建给浏览器输出的页面的时候Render事件就发生了。在Render事件过程中,页面调用其中的对象将它们呈递给Html。然后,页面就可以以Html的形式被用户的浏览器访问了。当Render事件被重载时,开发者可以编写自定义的Html代码使得原先生成的Html都无效而按照新的Html来组织页面。Render方法将一个HtmlTextWriter对象作为参数并用它将Html在浏览器上以网页的形式显示。这时仍然可以做一些修改动作,不过它们只是客户端的一些变化而已了。你可以重载Render事件,图示如下(图6):

图6

十.销毁对象
在呈递给Html完成后,所有的对象都应被销毁。在Dispose事件中,你应该销毁所有在建立这个页面时创建的对象。这时,所有的处理已经完毕,所以销毁任何剩下的对象都是不会产生错误的,包括页面对象。你可以重载Dispose事件,见图6。
全文总结
以上就是Asp.net页面生命周期中的十个事件。每次我们请求一个Asp.net页面时,我们都经历着同样的过程:从初始化对象到销毁对象。通过了解Asp.net页面的内部运行机制,我相信大家在编写、调试代码的时候会更加游刃有余的。
http://www.ccw.com.cn/htm/center/prog/02_3_12_2.asp

 

posted @ 2007-12-07 10:54 火木棉 阅读(72) | 评论 (0)编辑

2007年12月5日

注意 ExecuteNonQuery() 返回值 问题

   前些日子作一些数据项目的时候 在ADO.NET 中处理 ExecuteNonQuery()方法时,总是通过判断其返回值是否大于0来判断操作时候成功 。但是实际上并不是这样的,好在处理的数据操作多时 修改, 插入, 删除,否则的话问题就有点打了,都是些基础的知识,但是很重要个人觉得有必要记下来。

     ExecuteNonQuery()方法主要用户更新数据,通常它使用Update,Insert,Delete语句来操作数据库,其方法返回值意义:对于 Update,Insert,Delete  语句 执行成功是返回值为该命令所影响的行数,如果影响的行数为0时返回的值为0,如果数据操作回滚得话返回值为-1,对于这种更新操作 用我们平时所用的是否大于0的判断操作应该没有问题而且比较好,但是对于其他的操作如对数据库结构的操作,如果操作成功时返回的却是-1,这种情况跟我们平时的思维方式有点差距所以应该好好的注意了,例如对数据库共添加一个数据表的Create操作,当创建数据表成功时返回-1,如果操作失败的话(如数据表已经存在)往往会发生异常,所以执行这种操作时最好用try--catch--语句来容错。

  例如用ExecuteNonQuery()方法执行create操作

   

    SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=PSDB;Integrated Security=SSPI");
        
   string str = "CREATE TABLE aaa ( " +
  "[ID] [int] IDENTITY (1, 1) NOT NULL , " +
  "[BasicID] [int] NULL ," +
  "[AdoptedName] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ," +
  "[AdoptedSex] [char] (2) COLLATE Chinese_PRC_CI_AS NULL ," +
  "[AdoptBirthday] [smalldatetime] NULL ," +
  "[AdoptedType] [varchar] (100) COLLATE Chinese_PRC_CI_AS NULL ," +
  "[ApprTime] [smalldatetime] NULL ," +
  "[Remark] [varchar] (500) COLLATE Chinese_PRC_CI_AS NULL " +
") ON [PRIMARY]   ";     

  SqlCommand comm = new SqlCommand(str, conn);
        int i = 10;
        try
        {
            conn.Open();
            i = comm.ExecuteNonQuery();
            conn.Close();
        }
        catch (Exception ex)
        {
            Response.Write(ex.Message);
        }

        Response.Write(i.ToString());

       如果执行成功的话 返回的值为-1,如果数据表已经存在的话返回异常:数据库中已存在名为 'aaa' 的对象。

 

posted @ 2007-12-05 20:37 火木棉 阅读(1440) | 评论 (1)编辑

在SQL Server 2005 Express 中添加报表服务后 (Business Intelligence Development Studio) vs2005 加载程序集问题解决办法

  
     前些日子在安装报表工具是出现了程序集加载不上的问题于是法帖子求助csdn论坛,但是很长时间了,最后还是自己恢复了自己,问题解决了,把它放上来看有没有朋友出现相同的问题,供参考。

 

 发表于:2007-12-01 21:54:45 楼主
       请教
       在现有的vs2005 和sql server 2005 express 没有SQL Server Business Intelligence Development Studio执行工具 ,我就在微软下了个SQLEXPR_TOOLKIT_CHS.EXE 工具包安装SQL Server Business Intelligence Development Studio,但是按照默认 Development Studio 相关的文件是安装在 C:\Program Files\Microsoft Visual Studio 8\Common7\IDE\文件下的并且要引用devenv.exe来执行,其实就是引用与 Visual Studio 相同的执行文件,但是我在装vs2005的时候,默认把它装到了D盘,所以SQL Server Business Intelligence Development Studio运行时找不到devenv.exe文件,我将它的引用地址改为vs2005中devenv.exe的文件夹但是打开vs2005时还是不能创建商业智能项目,提示错误是:未能加载文件或程序集"Microsoft.ReportingServices.Designer,Version=9.0.242.0,Culture=nentral,PublicKeyToken=89845dcd8080cc91"或它的某一个依赖项。系统找不到指定的文件。 我像是没有引用程序集的问题吧 ,希望高手帮助!

(或者有些时候启动vs2005程序是会提示DataWarehouse VSIntegration layer ({4A0C6509-BF90-43DA-ABEE-0ABA3A8527F1})未加载。请与程序包供应商联系以获得帮助。如要尝试再次加载此包,请在命令提示处键入“devenv /resetskippkgs”错误)


发表于:2007-12-01 22:01:311楼 得分:0
         在处理上面的问题时 ,我想了个办法 就是将vs2005安装文件中的Common7\IDE\文件夹中除PrivateAssemblies和profiles两个文件夹外的所有的文件和文件夹都COPY到了C:\Program Files\Microsoft Visual Studio 8\Common7\IDE 文件夹下,然后直接开始-> sql server 2005 -> SQL Server BusinessIntelligenceDevelopment Studio来启动vs2005环境 并且创建报表成功,而且很多功能都没有问题,但是总觉得心里不太踏实,有没有其他好的解决办法,期待着高手帮助。


发表于:2007-12-05 14:25:172楼 得分:0
         等了这么长时间没有人回复阿 ,好在自己解决了,其实很简单就是手工将C:\Program Files\Microsoft Visual Studio 8\Common7\IDE 中的文件COPY道安装VS2005中的IDE中就可以了,开始的时候以为会将原来的文件覆盖损坏VS2005 现在看来没有问题了,因为C:\Program Files\Microsoft Visual Studio 8\Common7\IDE 中 PrivateAssemblies 和 Profiles两个文件中的信息和VS2005中的信息不重复直接覆盖追加就OK了。然后将SQL Server Business Intelligence Development Studio 关联到VS2005 的devenv.exe文件
不管从SQL Server Business Intelligence Development Studio 还是从visual studio 2005 启动添加报表项目都ok!


posted @ 2007-12-05 14:48 火木棉 阅读(300) | 评论 (8)编辑

2007年12月4日

c# 泛型集合Dictionary

     摘要: 泛型最常见的用途是泛型集合,命名空间System.Collections.Generic 中包含了一些基于泛型的集合类,使用泛型集合类可以提供更高的类型安全性,还有更高的性能,避免了非泛型集合的重复的装箱和拆箱。 很多非泛型集合类都有对应的泛型集合类,我觉得最好还是养成用泛型集合类的好习惯,他不但性能上好而且 功能上要比非泛型类更齐全。下面是常用的非泛型集合类以及对应的泛型集合类: 非泛型集合类 ... 阅读全文

posted @ 2007-12-04 22:12 火木棉 阅读(423) | 评论 (1)编辑