Categories

Links

OnTableNewRow 的怪异举止

显然,同一般的.net OnXX行为不同 ,通常的OnXX 会检查XX事件是否有设置,有的话就执行.

这段代码在DataTable.NewRow 中被调用

private void NewRowCreated(DataRow row)
{
if (this.onTableNewRowDelegate != null)
{
DataTableNewRowEventArgs e = new DataTableNewRowEventArgs(row);
this.OnTableNewRow(e);
}
}
protected virtual void OnTableNewRow(DataTableNewRowEventArgs e)
{
if (this.onTableNewRowDelegate != null)
{
Bid.Trace("<ds.DataTable.OnTableNewRow|INFO> %d#\n", this.ObjectID);
this.onTableNewRowDelegate(this, e);
}
}


大家可以看到,NewRowCreated中在检查onTableNewRowDelegate了,如果这个没有设置,则OnTableNewRow是不会被触发的,因此, 比方说你想要一个自定义的事件,比方说 NewEntity ,你无法在OnTableNewRow来挂接它. 你要先挂接TableNewRow事件,然后这个OnTableNewRow才能生效.这不是开玩笑吗?
      //protected override void OnTableNewRow(DataTableNewRowEventArgs e)
        //{
        //    base.OnTableNewRow(e);
        //    if (this.NewEntity != null)
        //        this.NewEntity(this, new NewEntityEventArgs<T>((T)e.Row));
        //}

[2007-11-11 10:43:01 | Author:jiangjianxiao ] [] 4 comments

.net 3.5有多少特性可在windows 2000中使用

这个题目不好起,因为有些东西是编译器的,有些东西是库的 .(而有些是两者结合的,比方说ExtensionAttribute就在system.core.dll中)  .net framework 3.0/3.5安装环境要求windows xp,但是现在企业中用windows 2000的也不少(大部分企业都需要好几年才会更新设备). 要放弃对windows 2000的支持,暂时还不太可能.
当target framework 设置为2.0 时,下面这些特性是支持的

数组初始化支持

string[] s={'test','test'}

集合初始化支持
    IList<string> s = new List<string> { "name", "name" };

类初始化支持
new Label{Text="label");

lambda 支持
    string[] list = new string[] { "abc", "12", "java" };

            string[] ll = Array.FindAll(list, s => (s.IndexOf("a") >= 0));
            foreach (string var in ll)
            {
                Console.WriteLine(var);
            }
            Console.ReadLine();


匿名类型支持

var emp=new {Name="jjx"};

把target framework设置为3.5 ,引用system.core.dll ,分发时带上system.core.dll ,这样 扩展方法也是支持的(经测试)

带上system.linq.dll ,那么linq 表达式也是支持的,如

IList<string> names=new List<string>{"test","test2"};
var q=from n in names where n=="test" select n;

更新
linq to sql  支持
.net framework 2.0 sp1 已经出来了,http://bbs.dotnettools.org/newsdetail.asp?id=5907 ,linq to sql 可以运行在windows 2000上

[2007-11-07 17:46:05 | Author:jiangjianxiao ] [] 1 comments

jruby 1.1b1

jruby 昨天放出了1.1 b1 版本,1.1 版本的目录是能完整编译为aot(ahead of time)或jit(just in time)模式。更快,以及更小的内存占用,最大的同ruby 1.8兼容。

下载 http://dist.codehaus.org/jruby/

ironruby 的更新频率就明显的不如jruby了,不过好在过一段时间,就会有一次比较大的更新。这估计是开发模式的不同 .不过ironruby 的未来还是不明朗(比方说是不是把运行rails作为目标)。从 asp.net mvc将发布而言,这个估计是不可能了的。

从这个链接可以更清楚的看到的asp.net mvc 应用的代码,http://www.sergiopereira.com/articles/aspnetmvc.html 。不过我不太喜欢这个示例,因为引入AccountViewData ,让人感觉还是在使用transaction script,而不是rails/django那种domain model driven 的方式。

另外,关于 osx leopard 的发布, 我现在正在使用 macbook,经过一段时间到熟悉 ,osx 得确不错, 不过仔细想来,总是不是个滋味 .首先是 osx 实际 上是一个 拿unix 重新 包装了一下,就开发 付出而言,同ms的自行开发根本 难以 等同而语的. 而,osx却借助于unix的基础获得了稳定/安全的美名. 另外,就是ms的东西,一上来就非得装个杀毒软件,日子久了,运行速度越来越慢,也的确是个大问题.对于vista,我连甚至连尝试兴趣都没有. 也算是ms的一大失败吧.

当然,现在,无论是osx/linux/unix都是无法取代windows的,但我想,市场 正在被这些操作系统所蚕食. ms应该需要意识这个问题了.
[2007-11-03 11:46:15 | Author:jiangjianxiao ] [] 1 comments

django小提示-send_mail

django.core.mail.send_mail
这个函数在文档中被注明为deprecated。 但它还是可以一用的

首先,在settings.py中增加如下变量
EMAIL_HOST="" #你的smtp 服务器ip 地址或名称
EMAIL_PORT=None # 不处理就用Noe,否则指明port
EMAIL_HOST_USER="你的用户名" # 现在大部分邮箱都要求你输入 邮箱的全名
EMAIL_HOST_PASSWORD="" # 你的口令
EMAIL_USE_TLS=None # 不处理就用None

然后就很简单的调用
from django.core.mail import send_mail
# help(send_mail)
send_mail ('subject','message','webmaster@easynew.com.cn',['jjx@easynew.com.cn'])

 

这个函数为什么会被deprecated ,其实就是有点magic ,屏蔽了上面这些设置,所以,要明白点,就要用
connection = SMTPConnection(host,port,username,password,use_tls,fail_silently)
EmailMessage(subject, message, from_email, recipient_list, connection=connection).send()

其实是一样的,自己最后也会搞这样的函数,还不如直接用省事

注:
tls - Transport Layer Security 传输层安全
某些老旧的邮件服务器不认得TLS 协议,因此当你尝试加密连接时,握手会话失败

fail_silently 失败时就跳过,可查看SmtpConnection的_send函数
try:
    #send mail
except:
    if not self.fail_silentily:
        raise
    return false
return true     

[2007-10-31 15:32:59 | Author:jiangjianxiao ] [] 1 comments

djang小提示-login_required

login_required 是django.contrib.auth.decorators 中的一个decorator,它的用法很简单

@login_required
def change_password(request):
 return HttpResponse('change_password)

1. 该方法从settings中获取LOGIN_URL设置

在settings.py中增加LOGIN_URL

LOGIN_URL='/accounts/login/'

2. 该方法会传递一个添加一个next 到querystring中,这样,你可以在你的自己的login 模板中获取这个这个变量,以便在登录后重新回到登录前页面(django自带的模板会帮你处理这个,因为我使用mako 为django的模板,所以不得不自己动手处理这个)

[2007-10-31 15:08:35 | Author:jiangjianxiao ] [] 1 comments

Total 91 Display 11 of 15
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
Powered by Google App Engine