无常

记录无常工作上的点点滴滴
posts - 106, comments - 344, trackbacks - 6, articles - 1

2008年2月12日

花了一天的时间把项目从linq2sql转到ADO.NET Entity Framework。

此项目bs部分工程量不算多,复杂的功能都做在cs部分上,bs只负责基础数据的维护和报表统计,

其实用linq2sql也可以满足了,但是linq2sql designer用得实在太不爽了,表少的时候还能应付,现在表增加到70几个了,找个表得找半天,linq2sql desinger也不提供个搜索功能:(

前天装好vs2008sp1,试了一下EF designer,增加了Overview窗口和Model browser,就为了这个也要换到EF

image

转换过程还算顺利,

1.把代码中linq2sql的DataContext换成EF的ObjectContext,这步可以用find/replace完成大部分工作

2.linq2sql创建新记录时是用DataContext.表名s.InsertOnSubmint(obj),而ef是ObjectContext.AddTo表名(object),提交变更也从DataContext.SubmitChange()改成Object.SaveChanges()

3. DataContext.表名s  =>  ObjectContext.表名,这部分可以replace完成

4.aspx文件中用到的LinqDataSource全部得换成EntitiDataSource,这里只有手工一个一个替换了,没法偷懒。LinqDataSource的查询条件需要手工换成Entity SQL,这部分工作是大头~ 还得学一下Entity SQL

5.如果linq2sql代码用到[].Contains(xx)运算的,参考一下这里的方法解决

6.如果linq2sql中访问数据库时有嵌套访问数据库的,如下面这段代码,在linq2sql中没问题。

image

如果按流程转到EF的话,就会遇到异常

image

image

这是因为EF中foreach读取数据时是采用DataReader在线读取方式,而linq2sql则是采取类似DataSet的先把所有数据从数据库中取出到内存的方式,

所以在EF中需要把外层循环改成

foreach (var depart in ctx.Department.ToList() )

 

转移工作基本就这些了

接下来要实下EntitySQL了~

posted @ 2008-08-13 21:33 无常 阅读(196) | 评论 (3)编辑

刚才看到这个POST  中介绍几种在进行耗时的操作时如何更新UI的方法,

如果使用c#的匿名方法来,我们可以让代码更简洁些。

代码如下:

image

运行效果:

posted @ 2008-08-03 21:59 无常 阅读(198) | 评论 (0)编辑

vs2008开发wince5程序,在模拟器中调试成功,连接到设备成功,但程序部署到真实设备时出错:

image

出错信息为:

image

解决办法:

从在

C:\Program Files\Microsoft.NET\SDK\CompactFramework\v3.5\WindowsCE\Diagnostics

把NETCFv35.Messages.zh-CHS.cab直接复制到设备中安装就可以了。

如果程序中用到SqlServer CE,那么同样还会遇到无法部署sqlce.ppc.wce5.armv4i.CAB之类的信息,

这时候可以直接把X:\Program Files\Microsoft SQL Server Compact Edition\v3.5\Devices目录中sql.wce5.armv4i.CAB复制到设备上再手工安装。

posted @ 2008-08-03 09:39 无常 阅读(56) | 评论 (0)编辑

Color structure:

Color结构体位于System.Window.Media命名空间中,Color使用3个byte属性分别表示R、G、B三原色的颜色分量。当R=G=B=0时为黑色,当R=G=B=255时为白色。此外,有个byte类型的A属性表示此颜色的“不透明度”,其值为0时表示为全透明,值为255时表示不透明。这些都是有winform System.Drawing命名空间中的Color相同的。

此外,Color还支持表示scRGB(也称为scRGB64,因原色使用64位表达)颜色空间。Color结构还有4个float类型的属性scA、scR、scG、scB来描述scRGB颜色空间,值范围为<=1 && >=0,它们和RGB颜色空间中的A、R、G、B属性相对应。

改变Color对象的sc[ARGB]属性时相应的[ARGB]属性也会被影响,反之亦然。

Colors类封装有一百多种常用的颜色。

 

SolidColorBrush:

最简单的单色画刷,

wuchang.cnblogs.com

窗口背景颜色即改为全红色。

Brushes类定义有141个标准单色画刷,但这些画刷处于“冻结(frozen)”状态,如果尝试修改这些画刷的值时就会抛出异常:

image

但是可以复制一份没有处于冻结状态的画刷副本,如以下代码是允许的:

image

 

LinearGradientBrush 线性渐变画刷:

渐变画刷可以将二种或以上的颜色混合渐变。渐变画刷最简单的使用:

image

运行后的效果:

image

渐变画刷中定义的点是相对于填充区域范围,如(0,0)是填充区域左上角的点,(1,1)为右下角。如将以上创建画笔对象代码改为:

image 

即为垂直方向渐变:

image

 

渐变画刷还可以使用GracientStop类来指定多个“关键颜色”点,如定义彩虹画刷:

image

效果如下:

image

 

RadialGradientBrush 放射状渐变画刷:

与线性画刷不同的是放射状画刷不需要定义起始和终止点,它默认的中心点是(0.5,0.5),即填充区域的中心。

image

效果如下:

image

当然射线中心点和X/Y方向的渐变倍数也是可以任意修改的:

brush.GradientOrigin = new Point(0, 0);
brush.RadiusX = 1.5;

image

出处:http://wuchang.cnblogs.com

posted @ 2008-07-04 00:29 无常 阅读(91) | 评论 (0)编辑

System.Windows.Application是WPF应用程序最为重要和常用的类,跟踪着整个应用程序的生命周期。和winform/delphi中的application功能类似。

创建一个应用程序

wuchang.cnblogs.com

运行这个程序后,什么都没有显示。但这个程序一直运行着,没有界面,只能通过任务管理器关闭它。

wuchang.cnblogs.com

 

定义一个Window

 image

修改Main方法为

wuchang.cnblogs.com

再次运行程序,看到一空白的窗口。与Winform窗体不同的是,wpf window默认背景颜色是SystemColors.WindowColor,系统默认是白色。

wuchang.cnblogs.com

这个窗口就是应用程序的主窗口,关闭此窗口后程序结束。

再次修改Main方法:

image

程序运行后有三个窗口了:

 wuchang.cnblogs.com

此时哪个窗口是应用程序的主窗口呢?

回答:标题为“第一个实例”的窗口是应用程序的主窗口,即最先创建的窗口。

 

在winform/delphi中,应用程序的主窗口关闭程序就结束了,而wpf程序则不是这样。

如果关闭了第一个窗口,程序并没有结束,而第二个窗口则接替着成了主窗口,一直要关闭程序中的最后一个窗口后程序才结束,这是wpf默认的方式。

这个行为由Application对象的ShutdownMode属性控制着,

ShutdownMode属性为ShutdownMode 枚举类型,有三种类型可选:

ShutdownMode .OnExplicitShutdown
只有在调用Application.Shutdown()方法才能结束应用程序。

ShutdownMode .OnLastWindowClose
在应用程序最后一个窗口关闭后程序结束。也是默认的处理方式。

ShutdownMode .OnMainWindowClose
在主窗口关闭时结束程序。

此属性一般在Application.Run()前设置,如:

image

其实,你可以在程序运行的任意时间随便修改。

另外,主窗口也可以在任意时间更改,如将Main方法修改为:

wuchang.cnblogs.com

程序运行后第二个窗口即是主窗口,如果在第三个窗口中点击了鼠标,则将其置为主窗口。

出处:http://wuchang.cnblogs.com

posted @ 2008-07-01 00:12 无常 阅读(106) | 评论 (0)编辑

之前介绍过一个.NET平台的分布式缓存indeXus.Net Shared Cache ,可是发现它还不是很完善,后来使用Memcached 了。后来收到邮件Shared Cache有新版本发布,整个架构都做了大改,性能应该有比较大的提升,但由于时间的关系,也没再去测试了。

今天在网上游荡看到一POST Velocity: A Distributed In-Memory Cache from Microsoft,MS大叔也开始关注这个领域了。

Memcached一样,Velocity也是一个内存储存的分布式缓存系统,不同的是Velocity是完全基于.NET平台的。看下Velocity的部署图

cc645013_image002

Velocity可以配置成一个缓存群集,可以根据需要通过简单的配置就可以往群集中添加服务器节点。Velocity既可以当作一个独立的缓存服务运行,客户端通过网络来存储数据;同时也支持嵌入到自己的程序中运行。有意思的是Velocity提供有一个ASP.NET session provider,通过它我们可以将ASP.net的session数据都保存到Velocity中,如果你在使用WEB群集,这是个很好的消息。

目前还是CTP1。

 

相关的资源:

http://msdn.microsoft.com/en-us/library/cc645013.aspx MSDN上的一篇文章,比较系统的介绍了Velocity的架构及应用场景。

http://blogs.msdn.com/velocity/default.aspx Velocity的官方BLOG

http://www.25hoursaday.com/weblog/2008/06/06/VelocityADistributedInMemoryCacheFromMicrosoft.aspx 一篇介绍Velocity使用的文章

http://code.msdn.microsoft.com/velocity/Release/ProjectReleases.aspx?ReleaseId=1120 下载地址。这个CTP1的下载压缩包就有12.5M  :(,包里有个asp.net和一个winform的DEMO,还有一个Quick Start .DOC文档,看完这些东东就知道怎么使用了。

posted @ 2008-06-11 01:15 无常 阅读(302) | 评论 (0)编辑

今天想在新服务器上配置VPN,在打开“路由和远程访问”控制台的时候出错了,提示“试图连接到数据库存储时出错”,控制左边的“远程访问策略”和“远程访问记录”节点都都有红色出错符号。

image

在系统事件中看到出错的信息为“与 Routing and Remote Access 服务相依的组为 NetBIOSGroup,该组中的组件均未启动。”

image

在百度“知道”找到了答案http://zhidao.baidu.com/question/2576488.html?fr=qrl

出现这个错误的原因:

设置vpn的前提是在"网络连接"属性里至少需要安装两个组件:"Microsofot网络客户端"和"Internet协议(TCP/IP)"。

检查服务器的设置,发现没安装“Microsofot网络客户端”,补上这个服务后就可以使用了。

image

posted @ 2008-05-29 14:53 无常 阅读(315) | 评论 (1)编辑

添加新tag时没有去掉tag前后的空格,导致此tag的链接出错。

如,添加tag

image

注意test后有个空格,提交后文章的tag显示为

image

博客边栏“我的标签”中显示

image

注意这二处地方的tag也都有个空格。对应的链接后有个+号,链接目标错误。

http://www.cnblogs.com/wuchang/tag/test+/

posted @ 2008-05-23 00:03 无常 阅读(155) | 评论 (2)编辑

1.数组初始化

大小为10的数组,每个元素值都是-1
int[] a = Enumerable.Repeat(-1, 10).ToArray();

大小为10的数组,从0至9递增

 

int[] b = Enumerable.Range(0, 10).ToArray();

 

大小为10的数组,从100,110,120,...,190

 

int[] c = Enumerable.Range(0, 10).Select(i => 100 + 10 * i).ToArray();

 

2.生成随机数序列

生成10个范围在10-100的随机数

Random rand = new Random();
int [] randomSeq= randomSeq = Enumerable.Repeat(0, 10).Select(i => rand.Next(10,100)).ToArray();

 

3.集合类型转换

int集合转成string集合

List<int> intList = new List<int> { 1, 2, 3, 4, 5, 5 };
List<string> strList = new List<string>(intList.Cast<string>());

反过来,把string集合转成int集合

List<int> a = strList.Select(o => int.Parse(o)).ToList();

4.数组倒序

int [] arr = { 1, 2, 3, 4, 5};
arr.Reverse();

现在arr的元素已经是5,4,3,2,1了

http://wuchang.cnblogs.com

posted @ 2008-05-21 11:44 无常 阅读(216) | 评论 (4)编辑

     摘要: 轻松一下~~

How can you tell when a programmer has had sex?
When he's washing the pepper spray out of his eyes.

~~~~~~~~~~~~~~~~~~~~~~~~~

Two bytes meet. The first byte asks, "Are you ill?"
The second byte replies, "No, just feeling a bit off."
  阅读全文

posted @ 2008-05-08 15:00 无常 阅读(109) | 评论 (0)编辑

     摘要: 这年头,怪事天天有。

刚才登录键行网银,看到“我的帐户”中是一堆陌生的帐户,误以为是登录错了钓鱼网站,吓一跳。再看一下地址栏,没错呀https://ibsbjstar.ccb.com.cn,再仔细看下网页,页面背景中有个大大的DEMO字样~~

银行也这么随意,我的银子呀~~没安全感了...

抓下几张图,引以为戒~~
  阅读全文

posted @ 2008-05-04 20:26 无常 阅读(410) | 评论 (5)编辑

在IE7中如果直接在javascript中用window.close()方法关闭浏览器,会弹出一个是否关闭的提示。因为在IE中只有弹出窗口才能在脚本中悄悄的关闭,否则都会看到这个提示窗口。

image

如果需要悄悄的关闭非弹出窗口,就可以欺骗一下IE,让它认为当前的窗口是个弹出窗口,然后就可以无提示关闭了。

首先定义个函数:

image

这段代码的重点在window.open函数的调用,__self代表当前窗口,执行window.open之后,浏览器就会把当前窗口当作是弹出窗口,接下来一行就可以直接使用window.close来无提示关闭窗口了。

image

posted @ 2008-05-01 01:07 无常 阅读(234) | 评论 (3)编辑

     摘要: AJAX编程经常需要Object<=>JSON之间转换,写了二个扩展方法:
public static string ToJSON(this object obj)
public static T ParseJSON(this string str)  阅读全文

posted @ 2008-03-08 21:59 无常 阅读(418) | 评论 (0)编辑

     摘要: Javascript中的SetTimeout和SetInterval函数很方便,把他们移植到c#中来。
public static void SetTimeout(double interval, Action action)
public static void SetInterval(double interval, Action action)
  阅读全文

posted @ 2008-03-08 14:45 无常 阅读(2035) | 评论 (9)编辑

     摘要: jQuery中使用each(callback)方法可以很方便的遍历集合,写了个c#版的,使用方法:
static void Main(string[] args)
{
string[] arr = new string[] { "A", "B", "C", "D", "E" };
arr.Each(p => Console.WriteLine(p));
Console.ReadKey();
}
  阅读全文

posted @ 2008-03-03 11:55 无常 阅读(368) | 评论 (2)编辑

     摘要: 如果表中的字段类型为 char(1) 时,Linq to SQL生成char (System.Char)的属性。linq 语句where p.LineCode =='A'生成的SQL是WHERE UNICODE([t0].[LineCode]) = 65,这样会使LineCode列上的索失效,引起全表扫描...  阅读全文

posted @ 2008-02-24 13:30 无常 阅读(1657) | 评论 (1)编辑

     摘要: 要在Asp.net web sites中使用PageMethods,必需要将服务端代码写在.aspx文件中...  阅读全文

posted @ 2008-02-23 23:52 无常 阅读(307) | 评论 (0)编辑

1.1、

在Linq to SQL中要删除一行记录,官方的例子教我这样做

Code1:
using (PubsDataContext pubsContent = new PubsDataContext())
{
    pubsContent.Log = Console.Out;
    Author author = pubsContent.Authors.Single(a => a.au_id == "111-11-1111");
    pubsContent.Authors.DeleteOnSubmit(author);
    pubsContent.SubmitChanges();
}

可是,马上我的程序支持到这里就跑不动了,第二行有异常。

image

为什么呢?

看一下MSDN关于Signle方法的说明:

image

哦,问题出在这里,Single要求符合条件的记录有且只有一行,否则就会发飙。

从以前的学习中我知道,调用Single方法时DataContent即刻从数据库中获取数据库,而这个时间如果获取不到auid="111-11-1111"的记录,返回的记录集是空的,就引发了上面的异常。

1.2、

我想找一个方法,让Linq不执行Select而直接Delete,搜完了MSDN,翻完了《LINQ in Action》,没有。

后来我想,既然Linq to sql有“延迟加载”功能,那么删除时能不能也“延迟”呢,我尝试这样:

Code 2:
using (PubsDataContext pubsContent = new PubsDataContext())
{
    var q = from a in pubsContent.Authors
            where a.au_id == "111-11-1111"
            select a;
    pubsContent.Log = Console.Out;
    pubsContent.Authors.DeleteAllOnSubmit(q);
    pubsContent.SubmitChanges();
}

我的程序被驯服了,不在这里发飙了。

难道Linq to sql真如我所想的直接执行delete from Authors where au_id='111-11-1111'这样的语句了吗?

2.1

带着上面的疑问,一步一步跟踪查看DataContent的Log。我发现,在用Single()方法来删除的时候,如果不出现异常,提交的SQL语句是这样的。

image_thumb_2

这里可以很清楚看出,Linq先从数据库中取出记录,然后再Delete。我们知道主键就可以确定表中唯一的记录了,可是为什么删除条件要把所有的列都加进去呢?老赵在这个post(在Linq to Sql中管理并发更新时的冲突[1],[2],[3] )里很详细的说明了这个问题。

我的目的只是要删除一行记录,可是这样使用Linq to sql却先从数据库里取出来再删除,实在是多此一举。那Code 2中的方法又是如何运行的呢?我们再来跟踪它。

2.2

为了更好的说明问题,我把Code 1中的代码改一下,另外还在数据库中预先添加二行记录,au_id分别为111-11-1111、111-11-1112

Code 3:
using (PubsDataContext pubsContent = new PubsDataContext())
{
    pubsContent.Log = Console.Out;
    var q = from a in pubsContent.Authors
            where a.au_id.StartsWith("111-11-111")
            select a;
    pubsContent.Authors.DeleteAllOnSubmit(q);
    pubsContent.SubmitChanges();
}

把==条件换成了StartsWith(生成SQL语句时,StartWith会生成Like '111-11-111%'匹配)。

现在再下这段代码执行的Log:

SELECT [t0].[au_id], [t0].[au_lname], [t0].[au_fname], [t0].[phone],
[t0].[address], [t0].[city], [t0].[state], [t0].[zip], [t0].[contract]
FROM [dbo].[authors] AS [t0]
WHERE [t0].[au_id] LIKE @p0
-- @p0: Input VarChar (Size = 11; Prec = 0; Scale = 0) [111-11-111%]
-- Context: SqlProvider(Sql2000) Model: AttributedMetaModel Build: 3.5.21022.8
 
DELETE FROM [dbo].[authors] WHERE ([au_id] = @p0) AND ([au_lname] = @p1)
AND ([au_fname] = @p2) AND ([phone] = @p3) AND ([address] = @p4)
AND ([city] = @p5) AND ([state] = @p6) AND ([zip] = @p7) AND ([contract] = 1)
-- @p0: Input VarChar (Size = 11; Prec = 0; Scale = 0) [111-11-1111]
-- @p1: Input VarChar (Size = 3; Prec = 0; Scale = 0) [qqq]
-- @p2: Input VarChar (Size = 3; Prec = 0; Scale = 0) [qqq]
-- @p3: Input Char (Size = 12; Prec = 0; Scale = 0) [qqq         ]
-- @p4: Input VarChar (Size = 3; Prec = 0; Scale = 0) [qqq]
-- @p5: Input VarChar (Size = 3; Prec = 0; Scale = 0) [qqq]
-- @p6: Input Char (Size = 2; Prec = 0; Scale = 0) [qq]
-- @p7: Input Char (Size = 5; Prec = 0; Scale = 0) [22222]
-- Context: SqlProvider(Sql2000) Model: AttributedMetaModel Build: 3.5.21022.8
 
DELETE FROM [dbo].[authors] WHERE ([au_id] = @p0) AND ([au_lname] = @p1)
AND ([au_fname] = @p2) AND ([phone] = @p3) AND ([address] = @p4)
AND ([city] = @p5) AND ([state] = @p6) AND ([zip] = @p7) AND ([contract] = 1)
-- @p0: Input VarChar (Size = 11; Prec = 0; Scale = 0) [111-11-1112]
-- @p1: Input VarChar (Size = 3; Prec = 0; Scale = 0) [qqq]
-- @p2: Input VarChar (Size = 3; Prec = 0; Scale = 0) [qqq]
-- @p3: Input Char (Size = 12; Prec = 0; Scale = 0) [qqq         ]
-- @p4: Input VarChar (Size = 3; Prec = 0; Scale = 0) [qqq]
-- @p5: Input VarChar (Size = 3; Prec = 0; Scale = 0) [qqq]
-- @p6: Input Char (Size = 2; Prec = 0; Scale = 0) [qq]
-- @p7: Input Char (Size = 5; Prec = 0; Scale = 0) [22222]

很失望,和我期待的结果不一样。

在这个测试中,DataContent先把所有符合条件的记录全部取回来,再一个一个Delete。

如果要删除的有10000条记录的话,天都黑了...

这点,不得不说Linq to sql有点笨了。

3

解决?

只能绕个圈子了。

DataContext提供有ExecuteCommend方法,可能使用此方法直接执行SQL命令。比如这样:

Code 4:
using (PubsDataContext pubsContent = new PubsDataContext())
{
    pubsContent.Log = Console.Out;
    pubsContent.ExecuteCommand("delete from Authors where au_id like '111-11-111%'");
}

也可以通过DataContext.Connection取得当前的数据库连接,然后再通过DBCommend来提交自己的SQL语句,

或者写个存储过程来负责删除。

4

LINQ,语言级集成查询(Language INtegrated Query)

明显,强在查询,删除就弱弱点 ;-)...

文章出处:http://wuchang.cnblogs.com

posted @ 2008-02-21 22:58 无常 阅读(1900) | 评论 (9)编辑

事发于ListView.EditItem 属性

MSDN对此属性的解释:

类型:System.Web.UI.WebControls.ListViewItem

ListView 控件中处于编辑模式的项;或者,如果没有项处于编辑模式,则为 null。

 

事发过程

我的页面是这样子的:

image

在ListView中嵌套一个Repeater控件显示和编辑子表数据。

因为在Update的时候ListView不会帮我更新Repeater中的数据,所以我需要在ItemUpdating事件中找到Repeater控件,再通过Repeater控件FindControl找到每行的数据。

按MSDN的说法,我可以这样做:

    protected void ListView1_ItemUpdating(object sender, ListViewUpdateEventArgs e)
    {
        Repeater repeater = ListView1.EditItem.FindControl("Repeater1") as Repeater;
        //....
    }

这样基本没问题,除非Update的是ListView的第一行

如果Update第一行,虫子就出现了。

image

启动Debug,看下,EditItem==null ???

image

不管是转到第几页,就是只在更新第一行时出错

如果Updata的不是第一行,那就没什么问题。

没折了,只能绕个圈子,通过this.ListView1.Items[e.ItemIndex]来FindControl

image

 

没办法,祭出Reflctor,打开System.Web.Extensions, Version=3.5.0.0程序集,找到System.Web.UI.WebControls.ListView.EditItem. Desassemble->

image

 

问题出在这里了,看红圈圈部分,如果编辑ListView的第一行时,EditIndex是0,而EditItem的实现竟然是判断大于0 :(

顺便看下EditIndex的实现

image

这个没什么问题了,如果设置值小于-1时就出错,=-1就认为是结束编辑状态。

 

难得第一次用ListView就遇到这种BUG。

MS的工程师也太粗心了。

 

附上个测试例子

ListViewBugTest.rar

posted @ 2008-02-20 02:47 无常 阅读(1905) | 评论 (10)编辑

在IT行业,中文的资料永远都比英文的慢几个月,而且原创性的也少得可怜,有空时,不妨去这些英文技术BLOG溜达溜达,也许会有意外的惊喜。

 

好的C#博客应该符合这些条件:

  • 有用的新闻、信息、技巧和代码例子
  • 定期更新
  • 原创内容,不是广告文章盗用别人的文章
  • 良好的组织,包含分类和tags
  • 健康的讨论和读者评论
  • 有一定的个人见解,最好还有点幽默感,但又不是自己在嗐吹牛

比如以下列出的这些博客:

B# .NET Blog

Bart De Smet's blog about Microsoft .NET technologies, including Microsoft in general, CLR and MSIL internals, C# and the future of the language, .NET Framework tips and tricks, SQL Server, and Microsoft events such as TechEd and IT Forum.  (Recent Post: C# 3.0 Object Initializers Revisited)

Bill Blogs in C#

Bill Wagner discusses C#, LINQ, and other items of interest.  (Recent Post: Creating Dynamic Queries in LINQ)

Brad Abrams

Design Guidelines, Managed code and the .NET Framework.  (Recent Post: What is new in the ASP.NET 3.5 Extensions Preview)

Charlie Calvert's Community Blog

There is no job in the computer industry Charlie would rather have than that of Community Program Manager for the C# group.  (Recent Post: LINQ and Deferred Execution)

David Hayden

David is an ASP.NET, C#, SQL Server Developer and Microsoft MVP with over 10 years experience.  [Disclosure: I worked with Dave a decade ago at Procter & Gamble.  He's a sharp guy.]  (Recent Post: Check All CheckBoxes in a GridView Using Client Side Javascript)

Developing for .NET

Home of Joel Cochran and Jim Burnett.  The reality of .NET is that with the thousands of classes available, there is simply too much to know.  No one can be an expert in everything, so we frequently hit the Search Engines looking for help and solutions to our problems.  Hopefully, this blog can help with that.  Topics will be simple solutions to common problems, some of them will be cries for help themselves.  In either case, everything posted here will be from Joel and Jim's real world experiences.  (Recent Post: Upgrade your C# Skills part 3 - Lambda Expressions)

DevTopics

Blog by Timm Martin about software development topics, with a focus on C# and the Microsoft .NET framework. DevTopics also discusses the creation and management of software companies, the software development process, and improving the computer experience for the average user and people with disabilities. And you should also find a healthy dose of programming tips, techniques and code.  [Disclosure: This is my blog, of course!]  (Recent Post: C# Object Initialization)

DotNetGuts

Discussion topics for ASP.net, C#, VB.net, .Net Framework, OOPs Concepts, and Programming.  (Recent Post: Design Patterns in ASP.NET 2.0)

ISerializable - Roy Osherove's Blog

Unit Testing, Agile Development, Architecture, Team System & .NET.  (Recent Post: IL Debug Visualizer for Compiled Lambda Expressions, MethodBase and DynamicMethod)

The Moth

By Daniel Moth, software developer, former MVP, and now a Microsoft employee.  (Recent Post: ThreadPool in .NET Framework v2.0 Service Pack 1)

OmegaMan's Musings

As a contract Architect/Developer/Programmer in the software industry, OmegaMan creates tools and architects code that never sees the light of day. This blog is a way to transfer some information to the community as a whole.  OmegaMan is a moderator on Microsoft's MSDN forums with over 2000 posts.  (Recent Post: Smart Resource Locking in C# .Net for Thread Safe Code)

Omer van Kloeten's .NET Zen

Programming is life, the rest is mere details.  (Recent Post: WPF's Use of Partial Classes' Access Modifiers)

ScottGu's Blog

By Scott Guthrie, General Manager within the Microsoft Developer Division.  Scott runs the development teams that build the following products/technologies: CLR and the core .NET Base Class Libraries, ASP.NET, Silverlight, WPF, IIS 7.0, and Visual Studio Tools for ASP.NET, WPF and Silverlight.  (Recent Post: .NET Web Product Roadmap)

Switch on the Code

By Brandon Cannaday, Charlie Key, and Michael Kuehl, software engineers who graduated from the fabulous Rose-Hulman Institute of Technology.  These are three guys who work full time but in their spare time run their fledgling company.  (Recent Post: C# Snippet Tutorial - Performance Timers)

Non-C# Blogs

The following blogs are not C#-specific but nonetheless can be quite useful for C# developers:

10X Software Development

By Steve McConnell.  Numerous studies have found 10:1 differences in productivity and quality among individuals and even among teams. This blog contains Steve's thoughts about what is needed to be on the "10" side of that 10:1 ratio, i.e., what it takes to be a 10x developer or a 10x team. Naturally, this blog focuses on Steve's specific interests: executive management, project management, high performance teams, estimation, reducing time to market, software development methods, construction practices, and related topics.  (Recent Post: Classic Mistakes Updated)

Coding Horror

By Jeff Atwood.  Why does Jeff blog?  Mostly for selfish reasons, he says. "I needed a way to keep track of software development over time–whatever I am thinking about or working on. I can research things I find interesting, document my research in public with a blog post, then easily find and refer to these blog posts later." (Recent Post: Hashtables, Pigeonholes, and Birthdays)

Joel on Software

By Joel Spolsky, a software developer in New York City. Since 2000, Joel has been writing about software development, management, business, and the Internet on this site.  (Recent Post: How to Demo Software)

Pawel Brodzinski on Software Project Management
Blog about the software development lifecycle. You can find here a range of topics from software design, to project management, to team-building, to management of a software development company.  (Recent Post: Usability is Made of Small Things)

 

文章转自:http://www.devtopics.com/best-c-blogs/

 

另外,园子里Dflying Chen 的“每周英文技术文章推荐”也很好http://www.cnblogs.com/dflying/category/74193.html,辛苦了,在此表示感谢。

posted @ 2008-02-20 00:48 无常 阅读(3525) | 评论 (35)编辑

上周Rich Strahl的POST中提到一个新发布的VS2008 hotfix修复了VS2008对Javascript智能感知的一些BUG,fixed之后可以让VS2008对JQuery提供智能感知,让我等JQuery fans欣喜了一阵子。可仔细一看,还需要另外给JQuery添加上XML comments才行 :(  丧气了...  

一、

刚才看到已经有快手的牛人做完了这项工作,现在可以直接下载(http://data.lancefisher.net/jquery-1.2.3-intellisense.js)回来用了。

这样引用就行了

<script src="jquery-1.2.3-intellisense.js" type="text/javascript"></script>

如果是在独立的.js文件中需要JQuery智能提示,那么在文件开始加上这行

/// <reference path="jquery-1.2.3-intellisense.js" />

就OK了。

但这个JS是未压缩版的jqery1.2.3,加上XML comments,有120K之巨,开发时用就行了,部署的时候可以换个pack版本的。

不过似乎VS2008对JS的智能感知还有点不足的地方,比如js中的重载函数就不能提供很好的提示支持...希望能再有改进

二、

另外,还有个JQuery XML comments的生成器JQuery IntelliSense Header Generator,这个生成器是根据JQuery官方提供的XML DOC来生成JQuery的函数签名和XML comments。注意,这里只生成函数签名,没有具体的实现。如果嫌第一种方法部署麻烦,那么就可以使用这个签名JS了,我们可以把脚本全部放到独立的.js文件中,然后在js中reference 这个假的JQuery,而在.aspx中则引用真正Pack版的jquery。

这个生成器有个BUG,因为jquery xml doc有些函数的说明中有些有回车符,而这个生成器没有做处理,导致生成的签名JS有误。

我修正了这个BUG,需要的同学可以点击这里下载。记住:这个生成器只生成jq函数签名和XML comments;这个生成器是根据JQuery官方的的XML API doc生成的,也就是说如果以后有版的JQuery API doc出来,你只要把它下载回来覆盖掉这个旧的就行了。

这个生成器生成的签名有个比较好的地方,就是它把重载方法的comments都放到一起了,也就是vs2008的智能提示中可以看到几个不同重载的comments.

出处:http://wuchang.cnblogs.com  email: wuchangx # qq.com

下面看下效果图:

image

图1

image

图2

image_thumb_2

图3

 

补充,如果修改脚本文件后,而VS2008的智能提示没有及时更新,那么可以使用快捷键Ctrl+Shift+J来更新一下。

 image

图4

posted @ 2008-02-18 23:06 无常 阅读(2204) | 评论 (20)编辑

项目中有些对象经常需要重置部分或全部属性到初始状态,想给这些类全部都加上个Reset()方法,又显得太冗余。Q.yuhen的这个Post中提出一种思路,使用默认构造函数来重置状态,这样实现:

class MyClass
{
public int X { get; set; }
public string S { get; set; }
public MyClass()
{
    X = 1234;
    S = "abc";
}
public void Reset()
{
    var ctor = this.GetType().GetConstructor(BindingFlags.Instance | BindingFlags.Public,
     null, new Type[0], null);
    ctor.Invoke(this, null);
}
}

这个方法很巧妙,但还是需要在每个类中都重复添加这个Reset()方法,而且每个都是相同的代码,不是很满意。

 

于是,探讨一种新的方法-----使用c#3.0的扩展方法(Extension Methods)功能来实现此功能,实现起来就二行代码。

    public static class ResetableImpl
    {
        public static void Reset(this object obj)
        {
            var ctor = obj.GetType().GetConstructor(BindingFlags.Instance | BindingFlags.Public,
                null, new Type[0], null);
            ctor.Invoke(obj, null);
        }
    }

这样就给所有的类都扩展了Reset()方法。

可是,这样实现有个很大的局限性,就是这个类必需有个默认构造方法,而且是在默认构造方法中初始化才行,否则是在做无用功。另外,我们并不是所有的类都需要Reset()方法,这样直接给祖先object扩展也不太合情理。

再改进,配合接口使用。

先定义一个接口IResetable:

public interface IResetable{}

这个接口什么也不做,只是个幌子,然后我们给这个接口添加扩展方法。(有关给接口添加扩展方法的事项,可以看下蝈蝈俊.net的这个POST:C#3.0 中使用扩展方法来扩展接口。)

现在来修改一下这个添加扩展方法的这个class,将扩展对象由object改为IResetable接口:

    public static class ResetableImpl
    {
        public static void Reset(this IResetable obj)
        {
            var ctor = obj.GetType().GetConstructor(BindingFlags.Instance | BindingFlags.Public,
                null, new Type[0], null);
            ctor.Invoke(obj, null);
        }
    }

然后,给我们的类加上IResetable接口,如这样:

    class Mail : IResetable
    {
        public string Subject { get; set; }
        public string Body { get; set; }
        public MailAddress From { get; set; }
        public MailAddress To { get; set; }
        public Mail()
        {
            this.Subject = "";
            this.Body = "";
            this.From = null;
            this.To = null;
        }
    }

使用的时候就很方便了:

    public class Program
    {
        static void Main(string[] args)
        {
            Mail mail = new Mail();
 
            mail.From = new MailAddress("wuchangx@qq.com");
            mail.To = new MailAddress("friend@anywhere.com");
            mail.Subject = "hi friend";
            mail.Body = "mail content.";
 
            Console.WriteLine("1\nFrom={0},To={1},\nSubject={2},Body={3}",
             mail.From, mail.To, mail.Subject, mail.Body);
 
            mail.Reset();
 
            Console.WriteLine("2\nFrom={0},To={1},\nSubject={2},Body={3}",
             mail.From, mail.To, mail.Subject, mail.Body);
 
            Console.ReadKey();
        }
    }
 

测试代码

image

运行结果

不过,这样还是要求必需在默认构造方法中做初始化:(,似乎某本c#大作中也提倡在构造方法中初始化的。

如果担心每次调用时Reflection的性能太低,那再改进一下:

    public static class ResetableImpl
    {
        private static object lockObject = new object();
        private static Dictionary<string, ConstructorInfo> dct = new Dictionary<string, ConstructorInfo>();
        public static void Reset(this IResetable obj)
        {
            string key = obj.GetType().ToString();
            ConstructorInfo ctor =null ;
            if ( dct.ContainsKey(key) ==false)
            {
                lock (lockObject)
                {
                    if (dct.ContainsKey(key) == false)
                    {
                        ctor = obj.GetType().GetConstructor(BindingFlags.Instance | BindingFlags.Public,
                            null, new Type[0], null);
                    }
                }
            }
            else
            {
                ctor = dct[key];
            }
            ctor.Invoke(obj, null);
        }
    }

出处:http://wuchang.cnblogs.com

posted @ 2008-02-12 00:29 无常 阅读(1908) | 评论 (7)编辑