分类“.NET学习日记”的存档

  • 10
  • 9月

今天9月10日,教师节。还没怎么祝福老师们节日快乐,自己先过了一把老师瘾。

前一段时候一直在做老师找来的那个与软件公司合作的项目。我们这边负责的是架构的搭建。到今天大概忙了有半个多月了。终于到了展示成果的时候了。

今天晚上,带着我心爱的本本,开始了把自己的知识传播给他人的过程。

可能是见面次数比较多的关系吧。今天给别人“上课”的时候一点也没紧张。讲的时候完全按照我预先设定的顺序。自我感觉比较良好*_^

要讲的东西实在太多(Ajax的客户端页面,分层架构的服务器端组成…),明天还得去一趟。

记得曾经看过的一篇文章中说过:做为一个程序员,绝对不要独享技术。一旦一个技术只有你能解决,那往往就是你恶梦的开始。

最后,Show一把我讲课的课件。有需要B/S模式下客户端动态表格编辑的Geek可以看一下。dhtmlXGrid表格显示控件简介

  • 02
  • 8月

今天玩asp.net时遇到了一个小小的问题:页面中有一个以JavaScript控制的select控件,用于时间的选择。

如何在asp.net的后台文件.cs代码中取得它的值呢?

第一个想到的方法是asp.net中最“正宗”的方法,把这控件标为runat=”server”,就可以在.cs代码中直接使用它的id访问它的属性了。但问题是这个控件是造客户端JavaScript代码来添加它的值的。而将select变为runat=”server”后,控件在客户端的id会被系统自动改变,不再是VS设计器中的那个id了。于是那段JavaScript就失效了。

然后就想到的传统的Form法,如同asp、php那样,在接受数据的页面取得post来的内容。在asp中,可以用 Request.Form(“XXX”)得到Form中的值。php中可以直接访问枚举数组$_POST[‘XXX’]。查阅文档,asp.net使用的与asp几乎相同的方法,使用Request.Form[“XXX”];(注意三种方法用的括号)。

但在我的程序中却意外的发现,这样取得的值始终是null。问题又出在哪呢?

又是一番排查,终于找到问题所在——又是可恶的name属性惹的祸!

这个问题其实在做php时就发现过,很简单:表单传值时只认name属性。如果不设置一个控件的name属性,不管你接收页用的是什么技术(asp、php、asp.net…)都无法取得这个控件的值。

这也就是为什么用DreamWeaver生成的控件代码总是会自动生成内容相同的两个属性,如:<input type=”text” id=”tt” name=”tt” />。JavaScript只认id、Form传值只认name。没办法啊!

总结一下,两句话:

1.asp.net中可以用Request.Form[“XXX”]这个索引指示器来实现传统的表单内容取值。

2.表单中的控件,只要不是runat=”server”,需要给它设上name=”xxx”的属性。

最后引用一篇介绍asp.net的Request对象的文章:asp.net技术浅析(九)

  • 01
  • 8月

今天做了个WebService的客户代理WebForm,要将WebService返回的DataSet中的表显示出来。

说到显示表格数据,最先想到的自然是GridView控件,然而教科书上给的DataSet全是在aspx前台文件里绑定到一个DataSource控件上的。而这个WebService返回的DataSet中有多个表,这些表在WSDL里又没有描述,所以无法用GUI搞定数据绑定。只有用代码了。

稍微上网查了一下,又试验了一下发现,其实这东西真的很简单——只要把支持的对象赋给GridView的DataSource属性就可以了。不过赋完值之后得显式地调用一下DataBlinding()方法,不然数据不会被显示出来。

如:
myGridView.DataSource = serviceReturnDataSet.Tables[“theTable”];
myGridView.DataBind();

这就OK了。

不过这样绑定有个很明显的问题:GirdView的列标题显示的都是服务器返回的值,对用户很不友好。怎样才能在代码中修改GridView的表头呢?

又是一番查找和尝试。找到了两个解决方案:

1.在前台aspx文件中实现

点击GirdView右上角的三角,在“GirdView任务”中选择“编辑列…”。取消掉“自动生成字段”的选择,手动添加与返回数据列数相等个BoundField字段,将它们的DataField属性手动设为需要绑定数据的每列的列名,HeaderText属性设为想要显示的名称。

确定后应该生成类似以下代码:
<asp:GridView ID=”scores” runat=”server” AutoGenerateColumns=”False” >
<Columns>
<asp:BoundField DataField=”C_name” HeaderText=”课程名称” />
<asp:BoundField DataField=”C_teacher” HeaderText=”教师” />
<asp:BoundField DataField=”C_hours” HeaderText=”学时” />
<asp:BoundField DataField=”C_scores” HeaderText=”学分” />
<asp:BoundField DataField=”scores” HeaderText=”成绩” />
</Columns>
</asp:GridView>

这样默认显示的“C_name”就会变成“课程名称”。而且利用这种方法还可以控制某些列是否显示。

2.在后台.cs代码中实现

只需在调用DataBlinding()方法前,改变GridView对应Columns的HeaderText属性即可。例:

myGirdView.Columns[1].HeaderText = “aaa”;

注意,该语句必需出现在myGirdView.DataBlinding();之前,否则不起作用。

  • 30
  • 7月

又拾起asp.net来了,而且还做了个相当“时髦”的东西:WebService。

小记一下这两天的开发心得。

1.WebService中想返回表格数据怎么办?

目前查到的方法只有让它返回一个DataSet,不能用DataTable的,好像目前也没有什么更好的内置对象可以返回。

貌似问题出现在将表对象串行化为xml时。并不是所有的对象都能良好地串行化为xml。

2.如何才能把在设计器中设计好的页面的一部分不发送到客户端?

在asp、php中,只要把相关html代码放到一个判读块的中间,就可以容易的实现控制是否将这一部分html代码发送到客户端。

但asp.net是表现与逻辑完全分离的,html里是没有代码的(当然,如果你非要像asp那样嵌我也没办法),怎样才能实现对是否输出的控制呢?

经过实验,只要把需要控制输出部分的顶级块做成runat=”server”,就可以在后台代码里控制它的visible属性,只要visible=false,该部分就不会被发送到客户端。

最简单的实现就是把这一部分放到一个div里:
<div id=”sendOrNot” runat=”server”><!–要控制是否输出的那部分html代码–></div>

3.使用正则表达式进行输入验证

sp.net提供了非常方便的输入验证控件。其中功能最强大的莫过于RegularExpressionValidator。虽然其功能强大,但正则表达式可不是每个人都能写好的。找到了一个网站,正则表达式仓库,推荐一下:egexlib.com

  • 20
  • 3月

其实这已经不能算是“.net学习日记”了,只是因为刚刚解决了在C#中没有完全搞明白的一个问题,故姑且放在这一类中吧。

这是从《Java2入门经典》这本书中抄来的:我们不能生成一个接口类型的对象,但可以生成一个接口类型的变量。这个变量就可以存储实现该接口的任何类型的对象引用。

“接口”就是接口嘛!

  • 18
  • 2月

Q:参看以下代码:
在类中定义了如下字段的方法:
private Cards hand;
public Cards PlayHand
{
get { return hand; }
}
其中Cards类继承了CollectionBase。
为什么明明PlayHand没有set,但仍可以使用PlayHand.Add()为hand增加内容呢?
14:35 2007-1-24
应该这样理解吧:PlayHand.add()实际上是get了hand,然后调用它的add()这个方法。并不是直接给hand赋了一个新值,所以不是set。

  • 14
  • 2月

书上说了,控件的Anchor属性对解决控件对窗口大小改变时的响应问题特别有用。可惜,我看了半天也没从书中看出到是怎么个“有用”法,经过自己实验,终于明白了是个怎么回事。

anchor在lingoes中的解释是:
n.  锚
vt.  抛锚停泊, 使固定

在.net的窗口中,它应该是实现了“使固定”这个意思。

在属性窗口点击Anchor右边的下三角按钮,有一个非常形象的窗口可以让你选择Top,Bottom,Left,Right四个属性值的组合。

这四个属性的作用是当你选择了表示控件一个方向的属性,如Left,那么控件的这个方向的边与窗口同方向的边的距离将会被锁定,当Left时,控件的Left边与窗口的Left边的距离将不会随窗口大小的改变而改变。

这 样锁定的结果就是,如果对称的一对边(Left和Right、Top和Bottom)中锁定了其中一个,当窗口大小改变时,控件会改变自身的位置,确保与 窗口对应边的距离不变。如果将对称的一对边都进行了锁定,当窗口大小改变时,控件对应方向的大小会随之改变,即被拉伸或压缩。

回想起当年玩VB6的时候对窗口大小变化的无奈,这个Anchor实在是个好东西!

  • 14
  • 2月

今天终于把《C#入门经典》的第Ⅰ部分“C#语言”看完了,并且成功完成最后一个完整的例子:利用那个学习过程中被不断扩展的CardLib完成了一个控制台的游戏。

通过这个游戏的代码也感受到了面向对象编程的方法。
在这个程序中每一张牌是一个Card对象,拥有最基本的ToString()方法用于表示自身的花色和牌序和实现ICloneable接口的Clone()方法。

几张牌的集合是一个Cards对象,继承了CollectionBase类,实现了对集合中Card的索引,同时也实现了ICloneable接口的Clone()方法,返回经过复制的一个Cards对象。

一 副牌Deck则包含一个Cards集合,用于存储其中所有的牌。此外还实现了更多功能:重新洗牌Shuffle()、取得其中特定序号的牌GetCard ()、实现ICloneable接口的Clone(),再有一个用于解决在GetCard()时牌已经用完的事件LastCardDrawn()

每一个游戏玩家是一个Player()类的实例,拥有自己的Name、自己手里的几张牌PlayHand和判断自己是否已经获胜的方法HasWon()。

整 个游戏是一个Game类的实例,有一副要玩的牌playDeck、被玩家扔掉暂时不能用的牌的集合discardedCards和几个玩家的集合 players,使用SetPlayer()方法加入玩家,Reshuffle()方法来处理Deck的实例playDeck的 LastCardDrawn事件,DealHands()方法进行发牌,PlayGame()进行游戏并返回胜出者的编号。

这样,在main()函数中要做的只是建立player对象,调用newGame.SetPlayers()初始化玩家,再调用newGame.PlayGame()一切就都搞定了。

整个游戏中每一个独立的部分都与一个对象对应,代码中每一个部分保持独立,互不干扰。完成每一部分功能的时候不需要过多地考虑会不会对其他部分产生影响。That’s OOP!

  • 03
  • 2月

对于一些资源,尤其是那些比较重要的系统级资源(如文件系统对象、网络系统对象、系统图形界面对象),使用后必需及时显式的释放,因为系统的垃圾回收器(GC)并不能保证在合适的时候被触发。
使用方法
1.用完后显式调用Dispose()方法
2.使用using结构,在对象超出作用域时using结构会自动调用Dispose()。
抄一段书上的代码:
using (Graphics g = this.CreateGraphics())
{
g.DrawLine(Pens.Black, new Point(0,0), new Point(3,5));
}
等价于:
Graphics g = this.CreateGraphics();
try{
g.DrawLine(Pens.Black, new Point(0,0), new Point(3,5));
}
finally{
if (g != null)
((IDisposable)g).Dispose();
}

  • 01
  • 2月

今天看了这两章,感觉明显有些发晕。毕竟不是些常用的东西。只是知道了程序集是.net组织程序,方便它们之间相互调用的一种方法。属性则是在程序中储存更多信息的一种方法。
因为感觉离自己的实际需要比较远,又从来没接触过相关的内容,一时大脑对这套东西还不能吃透。慢慢来吧。不用多久总会明白的。

所有标签:.net Ajax Java javascript Linux map MySQL RSS TD-SCDMA Ubuntu vim web Win7 乱码 基础知识 备份 奥运会 希望泉 性能 缓存 编程