|
|
2005年03月24日
2004年12月22日
最近一直忙于smartClient,对于自动更新方面,使用了AppUpdater组件,原因是简单易用,taskVision中用的就是它:)可以通过下面的地址获得更加详细的信息:
http://windowsforms.net/articles/appupdater.aspx
哪知刚部署就发现了一个严重的问题,每次update完成之后,应用程序目录下非装载Assembly的目录老是被自动删除(譬如我有一个Setup目录下面有products.mdb文件,此Setup目录老是被自动删除),然后重新启动应用程序后又重新自动安装了,非常讨厌,同时也是百般不解,本来对于VS.NET的Setup Project也不是特别了解,一直以为是配置有问题,试了N次还是找不到解决办法,最后才把目标锁定在AppUpdater组件上面,经过一翻追踪调试,发现问题所在,在Downloader.cs中的Scavenge方法,这个”清道夫”实在太霸道了,将应用程序目录下的非装载Assembly的目录全部都删除了。找到问题所在,简单将那个if语句修改一下,我简单的修改为:
if(Directory.Name.ToLower() == "appupdater") {//HardDirectoryDelete}
也可根据实际要求修改,反正不要让他这么“狂妄”就是了:)
简单的一点东西,花去了1整个上午的时间去调试,希望能对碰到此问题的朋友有帮助,不要再花费这个冤枉时间了。另外,如果更新服务器是windows2003,记得设置WEB_DAV为允许。
2004年09月21日
出于项目的需求,写了这样一个控件,使用起来很简单,只需要3句代码:
exportExcel.FileType = TSCRMLiteWeb.SC.ExportFileType.Excel; exportExcel.ExportFileName = "currencyList"; exportExcel.TargetControlID = "currencyContianer.gridCurrencyList";
需要说明的只有几点:
1.由于项目中所有需要导出内容的控件都是DataGrid,因此只针对对此控件的测试,满足需求先,其它就没有测试过了:)
2.属性ExportFileName不要扩展名,FileType属性指定以后,控件自身就会得到对应的扩展名了
3.最关键的地方就是TargetControlID,这是需要导出内容的服务器控件的“路径“,通常是DataGrid的ID值,如果你的DataGrid就直接在Page下面,那么TargetControlID的值就直接设为DataGrid的ID,如果DataGrid父亲控件不是Page,那么一直追朔到Page下的一级控件,比如上面的例子,currencyContainer就是一个Page下面的控件,gridCurrencyList的父亲控件是currencyContainer,他们之间用点号分开,看过代码后你就会知道是为什么了,就这些。这里是所有的代码:
ps:更新了一下代码,另外如果DataGrid中包含类似LinkButton这样的控件,绑定值的时候应该使用 ,而不要使用 <%#DataBinder.Eval(Container,“columnName“)%>这样的形式,因为这样Text将不会被倒入Excel中
2004年08月02日
IEWebControl相信大多数的Asp.Net开发人员都知道,即便没有用过也听说过,主要包含TreeView、TabStrip和ToolBar、MultiPage四个比较常用的控件,其中TreeView最常用,但是默认的IEWebControl却只能将资源文件(包括HTC和images文件)放到WEB站点的根目录下才能运行,这样对于很多无法更改服务器设置的用户来说是相关不便的,不过我们只要稍微手动修改一下MS提供的源代码,就能很快让整个控件都在应用程序目录下运行。
主要修改代码在BaseRichControl.cs文件中,通过跟踪可以发现寻找资源文件是通过FindCommonPath方法来执行的,其实可以发现此方法中已经预留了通过配置节设置资源文件的途径,下面是修改的步骤:
1.将FindCommonPath()中的return CleanupPath(path);修改为return context.Request.ApplicationPath + CleanupPath(path);
2.修改常量ConfigName的值为appSettings
3.在Web.Config中新增一个appSettings的配置节,key必须是常量CommonFilesKey定义的值,当然你也可以自己修改,至于value,看需要要放入虚拟目录的哪个路径下面
4.将IEWebControl解压缩出来的.htc和.gif文件放入web.config中指定的文件夹下面即可
这样,即便目标服务器没有安装IEWebControl,我们也可以让所有的控件都运行起来了.当然Asp.Net2.0已经将TreeView加为标准控件了,到时候不必这么麻烦了J
P.S:HttpContext.GetConfig(string name);读取的到底是什么地方的配置节呢?理解上应该是读取自定义的配置节,如果是自定义的配置节,应该是ConfigurationSettings.GetConfig()吧?不太明白,谁能具体解释一下呢?
AspNetForum V2现在已经被更名为Community Server :: Forums 2.0,由rhoward创建的公司 telligentsystems来管理,最新版本已经发布了,可以从下面的URL地址找到:
http://forums.asp.net/Forums/ShowPost.aspx?PostID=457530#457530 突然发现.Text的作者也加盟了telligentsystems,rhoward似乎很喜欢和优秀Open Source的开发人员合作,除了Forums 2.0,现在telligentsystems的团队中还有 nGallery、 .Text、FreeTextBox的作者、DotNetNuke的成员,全部都是流行的开源.NET项目.
2004年06月11日
ViewState在VB.NET中key区分大小写?可以观察下面的情况: ViewState("Customer_id") = 1
ViewState("Customer_Id") = 2
Response.Write(ViewState("Customer_ID"))
Response.Write(ViewState("Customer_id") <> ViewState("Customer_Id")) Session("CustomerId") = 1
Session("customerid") = 2
Response.Write(Session("CustomeriD"))
结果很明显,ViewState那个比较输出true,而Session的输出值则是预期的2,cookie也是预期的覆盖.通过Reflector察看一下ViewState的set操作通过调用Add来执行  StateBag.Add) Public Sub set_Item(ByVal key As String, ByVal value As Object)
Me.Add(key, value)
End Sub
不同的,Session或者Cookie的set操作都是通过类似dict(key) = value来实现set操作的,(HttpSessionState内部维护一个SessionDictionary,HttpCookie则是NameValueCollection). 通过Framework的文档可以看到IDictionary的Add方法,备注说明Add方法将不会修改现有元素,而StateBag内部正是维护一个IDictionary的bag字段,并且本身也实现了IDictionary,这样看来似乎都合乎情理了,但是继续察看StateBag.Add(String,Object)的实现,我却又模糊了,这是Reflector反编译出来的代码: Public Function Add(ByVal key As String, ByVal value As Object) As StateItem
If ((key Is Nothing) OrElse (key.Length Is 0)) Then
Throw New ArgumentException(HttpRuntime.FormatResourceString("Key_Cannot_Be_Null"))
End If
Dim item1 As StateItem = TryCast(Me.bag(key),StateItem)
If (item1 Is Nothing) Then
If ((value Is Nothing) AndAlso Not Me.marked) Then
Else
item1 = New StateItem(value)
Me.bag.Add(key, item1)
End If
Else
If ((value Is Nothing) AndAlso Not Me.marked) Then
Me.bag.Remove(key)
Else
item1.Value = value
End If
End If
If ((item1 IsNot Nothing) AndAlso Me.marked) Then
item1.IsDirty = True
End If
Return item1
End Function
从这段代码来看,难道是从IDictionary中通过key来读取value的操作区分大小写?不然item1不是Nothing就不可能调用bag.Add的方法,而是替换值,so,问题出在哪里呢?
2004年06月08日
Asp.net Forum V2 RC2版本已经release了,现在在http://forums.asp.net/forums可以看到整个UI有了很大的改变,至少看起来变漂亮许多了,原来Latest Source bug一堆,RC1版本也有很多问题,现在的这个版本已经有了比较大的改观了. 发现一个很大的变化就是顶头多了一个telligentsystems的logo,还有一些小字:
The ASP.NET Forums Toolkit is an Open Source discussion system for Microsoft® .NET®, managed by »telligentsystems.
检索了一下才知道这是Rob Howard的新公司,这位Asp.net的Program Manager,Asp.net Forum v1的主要开发者之一已经离开了MS了,万分惊讶... 尽管这样看来Asp.net Forum仍然有Rob Howard参与,不过不知道他在MS的接任者是谁,能否同样出色,或者更加出色...
2004年05月20日
传统的模式窗口中是使用向隐藏框架页提交,来避免submit以后弹出一个新窗口,(比如ASP时代),不过由于现在的Asp.net多数情况下都是自身PostBack,因此原来的方法变得不太行得通,为了PostBack不产生新窗口,可以使用如下办法:
这样在targetDialog.aspx中产生的任何PostBack都不会弹出新窗口.
另外传回值的情况,一般为了方便argument应该传递window对象,所以如果要在targetDialog.aspx中传值回parent主窗口的话,上述情况只是多了一层,通过parent.window.dialogArguments.document.getElementById("xxx"),就可以访问/设置主窗口中的这些控件状态值. 另一个更加简单的方法,在头中新增一行: 即可
2004年05月13日
树形结构是应用中常用的数据结构,最简单的设计类似:
id,name,parent_id 这种最简单的设计通常需要结合递归来最终形成树形UI,而且,对于要取得某一个节点的所有下级节点也不是很方便, 出于这种考虑,使用如下UDF来简化这种操作: --取得树形结构中当前节点的所有下级节点
CREATE FUNCTION [dbo].[GetChildCategories] (@parent_id int)
RETURNS @work Table (num int IDENTITY(1,1),category_id int) AS
BEGIN
declare @childrenCount int,@currCategory_id int,@num int
set @num = 1
insert @work
select category_id
from Category_Classification
where parent_id = @parent_id
set @childrenCount = @@ROWCOUNT
while (@num <= @childrenCount)
Begin
select top 1 @currCategory_id = category_id
From @work
Where num = @num
insert @work
select category_id
From Category_Classification
where parent_id = @currCategory_id
set @childrenCount = @childrenCount + @@ROWCOUNT
set @num = @num + 1
End
Return
END
主要是将一个递归操作转化为一个单一的循环操作,就这几句代码也不知道该怎么写注释了, 未有大数据量测试.
2004年05月08日
一个加亮代码片断的工具,这个在线页面应该可以为你在页面上paste美观的code snippet节省一些时间,支持不少的脚本和开发语言,比如常用Vbscript,VB.NET,C#,sql等等,check it here:
CodeHighlighter 记得最好不用选中那个多余Enable outlining的checkbox,这样会多出类似VS.NET中的折叠效果,但是需要特定的图片,生成的html代码多了很多的img标签. 最后,需要把生成的html代码放入一个pre标签中,一段美观的code snippet就生成了.
|