随笔 - 29  文章 - 1 评论 - 182 trackbacks - 3
<2007年11月>
28293031123
45678910
11121314151617
18192021222324
2526272829301
2345678

欢迎访问我的非技术博客:
http://Moosdau.blog.163.com

与我联系

搜索

 

常用链接

留言簿(3)

随笔分类(28)

随笔档案(29)

最新评论

  • 1. re: 在GridView中显示图片
  • @*梅花* & 一楼的: 首先可以用SELECT 语句直接筛选,类似下面的语句: SELECT CASE WHEN ‘设置了闹钟的条件’ THEN ‘闹钟图片或路径’ ELSE ‘空’ AS ‘...
  • --木刀
  • 2. re: 在GridView中显示图片
  • 请问,怎么让图片在满足一定条件下实现呢? 我向用gridview列出一些日程信息,如果有设置闹钟,在gridview中显示闹钟图片,如果没有设置关闭闹钟,就不显示图片. 而且我的数据绑定时从数据库绑定...
  • --*梅花*
  • 3. re: 多层母版页嵌套中, 内层母版页的事件默认不触发
  • 非常感谢,这个问题我找了一个上午,终于在你这里找到答案。
  • --SJYeah

阅读排行榜

评论排行榜

最近公司的数据库服务器从sql server 2000 升级到了2005, 随之, 就频发奇怪的事:
执行插入或是删除操作时, 最终确认后弹出错误对话框:
the data in row 1 was not committed.
error source: microsoft.sqlserver.management.datatools
error message: the updated row has changed or been deleted since data was last retrieved

首先可以肯定的是, 肯定不是过期了, 我只有两个字段的一个表, 在5秒内录入完数据, 确认, 还是插入失败, 而且也不是SQL SERVER 本身出了严重的故障, 因为在我自己的机器上的服务器就从没发生过这种问题. 在网上找了找, 只看到这一篇:
http://forums.microsoft.com/TechNet/ShowPost.aspx?PostID=2660498&SiteID=17&pageid=0#16748041
其它的地方没看到比较实质性的说法, 这篇文章中, 一个人,还不是微软的 , 提到, 在"服务器属性/ 连接/ " 里, 有一个no count 属性, 默认是勾选的, 把它勾掉, 就可以了, 于是找我们的DBA , 把这个选项勾掉, 一试, 果然好了, (要断开重连) 不知道是什么原因, 看起来好像是微软的一个bug.

用sql server 2005 几个月以来, 虽然我尽了最大的努力去适应它, 到现在为止却仍然是觉得要喜欢它真是一件困难的事:
各种常规操作的响应速度远远慢于sql server 2000;
右侧的listview 面板(object explorer detail) 不能自动激活, ( 如果当前激活了其它的标签页, 在左侧的object explorer 上点击一下, 没反应, 还要手动找到右侧面板, 才可以, 而且没有相应的选项. ) 让我郁闷了很久;
存储过程不能双击打开;
...

试用了sql server 2008 CTP, 基本上是照着2005 的模子做的, 唯一感觉惊喜的是写sql 语句也可以用智能感知了, 这实在是一个好东西, 可惜很不稳定, 一会儿有一会儿没有, 有的语句有, 有的语句没有. (select 就有, delete 就没有)  不过, CTP 版么, 难免的, 可以理解.

posted @ 2008-01-17 17:18 木刀 阅读(74) | 评论 (0)编辑
以下一个存储过程:

CREATE PROCEDURE dbo.sp1
AS

 SELECT 'abc'

在C#中:
var o=db.sp1();
GridView1.DataSource=o;
GridView1.DataBind();
会发现, 没有取到任何数据.

原因在于, SELECT 语句没有指定列名, 而LINQ 的查询必须带有列名, 但是如果这时仅仅把存储过程加个列名, 仍然取不到数据, 因为在dbDataContext 中, sp1 函数的定义已经跟原来的SELECT 绑定了, 必须把这个sp1 函数删除, 重新从数据库拖一个过来, 才来取到数据.

从这一点来说, 感觉还是有点不方便, 如果以后的技术能做到, 把表, 存储过程这些东西都自动更新, 都好了. 呵呵.

posted @ 2008-01-17 08:49 木刀 阅读(143) | 评论 (0)编辑
前几天用到多层母版页, 可是奇怪地发现, 内容页面, 以及最外层的母版页事件可以正常触发, 但是内层的母版页就是没有事件发生, 追了很久也没发现为什么, 后来再三检查, 终于发现在页面的html 源的第一行, <% Master %> 指令的"AutoEventWireUp" 属性被置成了false, 由于默认情况下, VS 都会都这个值置成true,所以很少会想到它, 不知道为什么VS 要默认把内层母版页置成不触发事件.
posted @ 2008-01-17 08:44 木刀 阅读(155) | 评论 (2)编辑
     摘要: 后台的key point 就是换页方法. 由于数据很多, 全部取出是不现实的, 我采用的做法是一次取一页, 虽然用户如果连续翻页的话可能会有问题, 不过鉴于这种做法的简单性, 以及用户实际上很少会连续翻页, 都是用查询功能获取数据, 所以就决定采用这种方案. 但是必须让用户知道有多少行, 多少页,就有以下一个初始函数:1protectedvoidInitPage()2{3PageCache=nul... 阅读全文
posted @ 2007-12-26 17:17 木刀 阅读(54) | 评论 (0)编辑

在一个内容比较多的报表页面, 由于要处理查询,换页,编辑等功能,怎样合理布局也不是那么容易就决定的, 这里展示了一种可能的方案. 先看设计视图:


第一行是标题, 第二行是一个显示错误消息的标签, 这是我很喜欢的一种风格, 其一, 相比写脚本来说更可靠一点, 其二, 更重要的是, 我很不喜欢页面弹出对话框让我点确定, 所以我也不想强奸自己的用户, 按说, 这种标签应该放在页面的下方, 不过考虑到用户可能不容易注意到下面的东西, 而这些错误信息往往非常重要, 所以我最终决定把它放在页面的第二行.

第三行是按钮 & 功能区域, 这也是经过很久的尝试决定下来的, 把所有的按钮集中摆放, 当然, 这个页面有点特殊, 它下面还有指向其它页面的链接, 一般的页面下面就没有别的功能性控件了.
第四行是搜索区域, 用多个文本框, 而不是dropdownlist, 更方便于复杂的查询, 而提示标签和文本框是横向排列还是纵向排列, 也是容易发生分歧的地方, 如图所示, 我认为纵向排列看起来更整齐, 所以我采用了纵向排列.
最下面一行还有一个小标签, 是显示搜索条件的.
运行时视图如下,这是把IE 全屏后的截图:




这里面用到了一点小技巧, 在我的页面上, 有这样一段代码:

 1        <script language="javascript" type="text/javascript">
 2            function window.onload()
 3            {
 4                if (dgc!=null
 5                
 6                    dgc.style.width=document.body.clientWidth-dgc.offsetLeft-20;
 7                    dgc.style.height = document.body.clientHeight-dgc.offsetTop-40
 8                    tdLayout.width=window.screen.width-700;
 9                }
 
10            }

11        
</script>

 其中dgc 的定义, 及dataGrid 的headerStyle 如下:

1<div class="ScrollRegion" id="dgc" style="POSITION: relative; TOP: 0px">
2
3<HeaderStyle Font-Size="11pt" Font-Bold="True" Wrap="False" ForeColor="Black" CssClass="Freez" BackColor="#8CCFF7"></HeaderStyle>

这里面用到两个css 属性, ScrollRegion 和Freez , 这两个属性的定义如下:
 1.ScrollRegion
 2{
 3    overflow: scroll; 
 4}

 5
 6
 7.Freez
 8   { 
 9    
10    table-layout:fixed;
11    position:relative;
12    top:expression(this.offsetParent.scrollTop);   
13    z-index: 10;
14   }
 

window.OnLoad 函数的前两行所实现的效果, 就是把datagrid 限定到如运行效果图所示的适合页面的大小, datagrid自身卷动, 而不会让整个页面卷动, 第三行是调整搜索框的间距, 不过"700" 这个值是别的页面的, 这个页面不需要这一句, 原因: 如果一行只有两个文本框, 设三个td , 前两个td设width 各110, 第三个td 不设置, ie 会如何显示? 它并不会听话地让前两格标准地呈现110px 宽, 而是会向后面的空白地址匀, 导致两个文本框看起来离得很远, 解决办法就是为第三个td 也设一个宽度, "挤" 得前两格不能后移. 由于客户端的分辨率不确定, 所以我用了脚本动态设置, 而没有直接写进页面里.

经过这个小技巧, 页面整体看起来就舒服多了.
posted @ 2007-12-26 16:25 木刀 阅读(63) | 评论 (0)编辑
假设一个常见的场景先吧----实际也是我当前的场景-----把一个excel 文件导入到数据库. 这实在是一个常见的功能,但是,没想到的是, 我着实费了一把劲.

实际上,我以前写的有现成的函数来完成这个工作, 但是, 可惜那函数只能在VS2005 下工作, 在2003下面无效,无效的原因是,vs2003 的DataTable.Rows[i].SetAdded() 方法不存在. 也就是说, 你没有办法去更改一行的RowState, 而从excel 读到的dataTable的 行状态"默认" 是unChanged.

如果不信, 你也可以尝试去google或百度上搜一下试试看, 关于这个功能的贴子真是少得可怜,大约大家都换用vs2005了吧, 我找了半天, 零零碎碎地找到一些信息, 这些信息都指向DataTable.GetChanges(RowState) 函数, 由于都是语焉不详, 所以我高兴地认为, 这个函数能将表的所有行的状态都设置为参数所指定的RowState, 就像我原来的函数用一个for循环为每一行调用SetAdded 的效果一样, 我一边还惭愧, 以前用了那么笨的办法. 然而心底却在奇怪, 微软怎么会起了这么笨的一个函数名.

一番测试后, 终于弄明白原来不是微软笨,而是我弄错了, GetChanges函数果然是用来Get, 而不是set的, 它返回母表中指定状态的行组成的子表, 也就是说, 刚才的查找白费了.

再找了一会儿, 借助于Mitch Milam 先生十分专业的一篇文章, 终于找到了正确的solution, 这篇文章的url:
http://blogs.infinite-x.net/2006/09/21/the-saga-of-net-dataadapterupdate-and-multiple-tables/print/
说它专业, 是因为这篇文章几乎是以正规科技论文的格式来写的, 虽然我自己写论文的时候很讨厌麻烦的格式, 但是阅读的时候, 却不得不承认, 这种严谨的格式读起来实在是愉快地多. ----废话少说, 问题的关键在于行状态, 从excel 读取后成了unchanged, 而且又无法修改, 问题就在于读取. 原来数据适配器有一个AcceptChangesDuringFill 属性, 这个属性默认为true, 所以调用Fill 方法后, 它就自动地AcceptChange了 , 然后行状态就变成unchanged了, 只要把这个属性置为false, fill 后, 就可以保持行状态为Added, 然后在update 函数里就不需要考虑行状态了.

以下为不太熟悉这两种操作的朋友列出源代码, 为了阅读方便,去掉了错误检查部分的代码,但在实际应用中, try语句是不可缺少的:
<0>调用代码:
1string path="upload";
2DataTable dt=ImportFromExcel(path);
3string selectCommand="SELECT * FROM T1";
4UpdateToDataBase(selectCommand,dt);

<1> 从excel 读取数据
 1DataTable ImportFromExcel(string path)
 2{
 3    path=Server.MapPath(path);
 4    upload1.PostFile.SaveAs(path);
 5
 6 string connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + path +";Extended Properties='Excel 8.0;HDR=yes;IMEX=1;'";
 7    string selectCommand = " SELECT * FROM [Sheet1$] ";
 8   DataTable dt=new DataTable();
 9
10    System.Data.OleDb.OleDbConnection conn=new System.Data.OleDb.OleDbConnection(connString);
11    conn.Open();
12    System.Data.OleDb.OleDbCommand cmd = new System.Data.OleDb.OleDbCommand(selectCommand, conn);
13    System.Data.OleDb.OleDbDataAdapter adt = new System.Data.OleDb.OleDbDataAdapter(cmd);
14    adt.AcceptChangesDuringFill=false;
15    adt.Fill(dt);
16    conn.Close();
17    System.IO.File.Delete(path);
18    return dt;
19
20}
这里面的trick 就是第14 行.

<2>提交DataTable 到数据库

 

 1void UpdateToDataBase(string sql,DataTable dt)
 2{
 3    string connString=GetConnectionString();
 4
 5   System.Data.SqlClient.SqlConnection con = new System.Data.SqlClient.SqlConnection(connString);
 6   System.Data.SqlClient.SqlDataAdapter adt = new System.Data.SqlClient.SqlDataAdapter(sql, con);
 7   System.Data.SqlClient.SqlCommandBuilder builder = new System.Data.SqlClient.SqlCommandBuilder(adt);
 8    adt.InsertCommand=builder.GetInsertCommand();
 9    con.Open();
10    adt.Update(dt).ToString();
11    con.Close();
12}

13
posted @ 2007-12-21 13:10 木刀 阅读(283) | 评论 (0)编辑

如果有10个文本框在页面上, 并且想设置一下它们的字体, 在VS2005里面, 只要按住ctrl , 把它们都选设一下就好了, 但是在vs2008 , 或是expression web中, sorry, 你必须一个一个地设置它们------vs2008的新的设计器不支持多选.
简直是难以相信. 但这就是事实. 在以下的地址可以看到一个微软的工程师的原贴:
http://forums.asp.net/t/1170907.aspx

这里摘录他的一句话:
Unfortunately, new designer does not support multiple selection (same as Expression Web and earlier FrontPage). This is a popular request so we are considering adding the feature in VS10 (i.e. it will not be in VS 2008).

看来即使开发环境换成vs2008, 还是很必要放一个2005 等在那里, 万一发生了这种需求, 不至于累死.

posted @ 2007-12-21 09:36 木刀 阅读(451) | 评论 (5)编辑

这个功能在VS 中默认是禁用的, 一直没用过, 最近偶然发现, 还真是好用的.

打开方法: 在选项中, 找到"项目和解决方案" 一节, 勾选"在解决方案管理器中跟踪活动项" 即可.

效果: 当一个代码页被选中的时候, 解决方案中相应的文件就会自动被选中, 即使这个文件处于多层文件夹中, vs也会自动把这些文件夹展开, 选中当前文件. 对于比较大的项目来说, 这个功能实在是不错.

posted @ 2007-12-07 09:37 木刀 阅读(187) | 评论 (3)编辑
做一个简单的实验先:
在vs2003中, 新建一个网页, 拖上一个textbox, 将它的readonly 设成true, 然后再放一个input: button, 给它写代码: document.getElementById("txt1").value="test"; 再放一个服务器端的button, 不用写代码.

好了, 开始运行, 点击客户端按钮, 会发现textbox 的值变成了test, 然后再点服务器端按钮使页面回传, 值仍然在, 也就是说, 服务器端的 txt1.Text 属性已经被成功更新了, 事实上, 这时候如果在txt1.OnTextChanged 事件的处理器中下断点, 可以看到事件被触发了.

但是, 在vs2005中, 做同样的动作, 点击服务器端按钮使页面回传后, textbox 的值就会丢掉, 给txt1.OnTextChanged 的处理器下断点, 发现事件没有被触发. 如果readonly 为false, 则服务器端的值被更新.

这一功能在vs 2005中的解决办法有:
<1> 不要将textbox 设为readonly , 而是在pageLoad 中, 为其增加一个readonly attribute, 这样在客户端它仍是只读的, 但是在服务器的眼里, 它不是只读的.
<2>用input:text 或其它代替textbox.
<3>在服务器端用Request.Form[txt1.UniqueID] , 可以取到更改后的值.

any way , 像我们公司一样, 在原来的项目中大量地应用了这一特性, 升级的时候, 大量的无聊工作就不可避免了.
真郁闷.
posted @ 2007-12-06 11:22 木刀 阅读(234) | 评论 (3)编辑

最近被这个问题快折磨死了.

在VS2005 中新建一个AjaxEnabledWebSite, 添加一个母版页, 再添加一个内容页,
在内容页中添加updatePanel, 或是其它的ajax 控件, 都会报错, 一是没有智能感知,
二是在包含在其中任何控件都会报错. -----运行的时候是正确的, 切换到设计视图也是好的,
但是就只是在"源" 视图, 会报错, 如下图所示:



非母版页的页面则是正常的, 虽然不影响运行 , 但是把源视图的代码弄得很乱, 没有一点格式, 我手动
调整以后, 它自己又会乱掉, 而且在编译的时候, 这些全部都被认为是编译错误, 而不是警告, 虽然这些
错误不影响运行, 但是错误列表里几十几百个错误影响到了其它错误的查找, 而且极度影响心情, 哪个老大
知道怎么处理? 

谢谢~~

btw: 我装过ajaxtoolKit 那个工具包, 不知道是不是受它影响.

posted @ 2007-11-30 10:02 木刀 阅读(383) | 评论 (7)编辑