无常

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

2008年7月4日

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 无常 阅读(28) | 评论 (0)编辑

2008年7月1日

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 无常 阅读(51) | 评论 (0)编辑

2008年6月11日

之前介绍过一个.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 无常 阅读(186) | 评论 (0)编辑

2008年5月29日

今天想在新服务器上配置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 无常 阅读(164) | 评论 (1)编辑

2008年5月23日

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

如,添加tag

image

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

image

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

image

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

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

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

2008年5月21日

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 无常 阅读(182) | 评论 (4)编辑

2008年5月8日

     摘要: 轻松一下~~

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 无常 阅读(96) | 评论 (0)编辑

2008年5月4日

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

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

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

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

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

2008年5月1日

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

image

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

首先定义个函数:

image

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

image

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

2008年3月8日

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

posted @ 2008-03-08 21:59 无常 阅读(314) | 评论 (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 无常 阅读(1943) | 评论 (8)编辑

2008年3月3日

     摘要: 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 无常 阅读(274) | 评论 (2)编辑

2008年2月24日

     摘要: 如果表中的字段类型为 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 无常 阅读(1609) | 评论 (1)编辑

2008年2月23日

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

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

2008年2月21日

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 无常 阅读(1831) | 评论 (9)编辑