tgbaoli

积累、沉淀、规则、规律、逻辑思想。
posts(9) comments(0) trackbacks(0)
  • 博客园
  • 联系
  • 订阅 订阅
  • 管理

与我联系

  • 发短消息

搜索

 

常用链接

  • 我的参与
  • 我的新闻
  • 我的标签

留言簿

  • 给我留言
  • 查看公开留言
  • 查看私人留言

我参与的团队

  • 深圳.NET俱乐部(2/1590)

随笔档案

  • 2008年8月 (2)
  • 2008年7月 (1)
  • 2008年6月 (1)
  • 2008年5月 (3)
  • 2008年4月 (2)

最新评论

阅读排行榜

评论排行榜

2008年8月20日

ASP.NET页生命周期概述

ASP.NET页被翻译输出到浏览器的过程可分为几个阶段,这些阶段在页面的创建和翻译中有各自不同的目的.了解页面的生命周期非常重要,这样就能在合适的生命周期阶段编写代码,以达到预期效果.要记住的一个关键概念是,不论何种情况下,一个ASP.NET页的实例化和销毁是在同一个请求下完成的.

一、  下面例出了常规页生命周期所经历的若干阶段:

 (1) 、请求页面: 页面的请求发生在页面生命周期开始之前.即页面实例化之前.当用户请求位于Web服务器上的某页面时,ASP.NET检查缓存中是否存在该页面的翻译输出,若有,则直接将缓存中的结果返回给客户端,略去ASP.NET页生命周期中的其他阶段;若无,则进入下一个阶段,即页面开始阶段.

 (2)、页面开始: 在这个阶段,页面被实例化,输入/输出属性Request 和Response被设置。此外,ISPostback属性被设置,该属性说明请求是一个新请求,还是由以前翻译输出的ASP.NET页所发起的请求。还有UICulture属性被设置。

(3)、页初始化:在初始化阶段,控件被实例化(将设置每个控件的UniqueID属性),并且页面的层次被构造。此外,主题和外观信息被应用到页面。如果当前请求是回发请求,则回发数据尚未加载,并且控件的属性此时并没有还原为视图状态的值。

(4)、加载:在加载阶段,如果当前请求是一个回递,则控件的属性将从视图状态赋值。

(5)、确认(验证):在确认(验证)期间,将确认页面中所有控件的状态,将调用页面中各控件的Validate方法,从而确定了页面的IsValid 属性的状态。确认阶段用于对用户的输入施加规则约束。

(6)、回递事件处理:如果请求是一个回递,则将调用所有事件处理程序。诸如鼠标点击、索引改变等事件的处理。重要的一点是要记住,事件处理器是在页面的加载阶段完成之后才被调用。

(7)、呈现(翻译):在呈现期间,视图状态将被保存到页,然后也将调用每个控件,以将其呈现的输出提供给页的Response属性的OutputStream.

(8)、卸载:当完全呈现页,即页完全翻译输出,其他控件都不再产生翻译输出时,便进入卸载阶段。

二、页面生命周期中的事件

(1)、Page_PreInit : 该事件在初始化阶段的开始被调用。典型的使用有

                                                 + 使用IsPostBack属性确定是否是第一次处理该页

                                                 +创建或重新创建动态控件

                                                  +动态设置主控页

                                                  +动态设置Theme属性

                                                   +读取或设置配置文件属性值

注意:如果请求是回发请求,则控件的值尚未从视图状态还原。如果在此阶段设置控件属性,则其值可能会在下一阶段被改写。

(2)、Page_Init:在初始化阶段被调用,用来对控件属性初始化。

(3)、Page_Load:读取和更新已有的控件属性。在这个阶段,控件属性已经根据视图状态被重新设置。

(4)、控件事件:调用控件自身的事件,例如响应鼠标电击、改变ListBox的索引值等等。如果页面有验证控件,在调用事件处理器之前,需要检查控件和页面的IsValid状态

(5)、Page_PreRender:对页面进行最后的更改

(6)、Page_Unload :该事件在ASP.NET丢弃页面来处理成本较高的数据库连接等资源之前被调用。此事件也常常用于记录最终的日志和跟踪信息。

posted @ 2008-08-20 16:46 铁山 阅读(6) | 评论 (0) | 编辑

2008年8月12日

存

Code
    public static bool ResponseFile(HttpRequest _Request, HttpResponse _Response, string _fileName, string _fullPath, long _speed)
    {
        
try
        {
            FileStream myFile 
= new FileStream(_fullPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
            BinaryReader br 
= new BinaryReader(myFile);
            
try
            {
                _Response.AddHeader(
"Accept-Ranges", "bytes");
                _Response.Buffer 
= false;
                
long fileLength = myFile.Length;
                
long startBytes = 0;

                
double pack = 10240; //10K bytes
                
//int sleep = 200;   //每秒5次   即5*10K bytes每秒
                int sleep = (int)Math.Floor(1000 * pack / _speed) + 1;
                
if (_Request.Headers["Range"] != null)
                {
                    _Response.StatusCode 
= 206;
                    
string[] range = _Request.Headers["Range"].Split(new char[] { '=', '-' });
                    startBytes 
= Convert.ToInt64(range[1]);
                }
                _Response.AddHeader(
"Content-Length", (fileLength - startBytes).ToString());
                
if (startBytes != 0)
                {
                    
//Response.AddHeader("Content-Range", string.Format(" bytes {0}-{1}/{2}", startBytes, fileLength-1, fileLength));
                }
                _Response.AddHeader(
"Connection", "Keep-Alive");
                _Response.ContentType 
= "application/octet-stream";
                _Response.AddHeader(
"Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(_fileName, System.Text.Encoding.UTF8));

                br.BaseStream.Seek(startBytes, SeekOrigin.Begin);
                
int maxCount = (int)Math.Floor((fileLength - startBytes) / pack) + 1;

                
for (int i = 0; i < maxCount; i++)
                {
                    
if (_Response.IsClientConnected)
                    {
                        _Response.BinaryWrite(br.ReadBytes(
int.Parse(pack.ToString())));
                        Thread.Sleep(sleep);
                    }
                    
else
                    {
                        i 
= maxCount;
                    }
                }
            }
            
catch
            {
                
return false;
            }
            
finally
            {
                br.Close();

                myFile.Close();
            }
        }
        
catch
        {
            
return false;
        }
        
return true;
    }
    
protected void DataList1_ItemCommand(object source, DataListCommandEventArgs e)
    {

        
if (e.CommandName == "loadItem")
        {
            LinkButton link 
= (LinkButton)e.Item.FindControl("LinkButton1");
            
if (link != null)
            {
                
string _fileName1 = link.Text.ToString();
                
string _fileName = link.CommandArgument.ToString();
                
//string sql = "select uploads from upfile where title=" + "'" + title + "'";

                
                
string path = @"D:~\UpLoads\";
                
string _fullPath = path + _fileName;

                
bool success = ResponseFile(Page.Request, Page.Response, _fileName, _fullPath, 1024000);
                
//bool success = ResponseFile(Page.Request, Page.Response, "filename1", @"D:\tantao\UpLoads", 1024000);
                if (!success)
                    Response.Write(
"<script>alert('下载文件失败!')</script>");
            }

posted @ 2008-08-12 11:40 铁山 阅读(13) | 评论 (0) | 编辑

2008年7月29日

设置GridView行的背景色以及鼠标经过时背景色变换

做个根据时间变化比较而用颜色表示的GridView,主要是通过RowDataBound事件来操作:

 

 protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    
{
        
if (e.Row.RowType == DataControlRowType.DataRow)//判断是否是DataRow,以防止鼠标经过Header是也有效果
        {
            
            
int tempdate = Convert.ToInt16(DataBinder.Eval(e.Row.DataItem, "DayCount"));//获取时间比较的结果值

            
if (tempdate > 20 && tempdate < 841)
            
{
                
//设置背景色
                e.Row.BackColor = Color.Red
                  
//鼠标经过时,背景色变换
                e.Row.Attributes.Add("onmouseover", "this.style.backgroundColor='#CDCD00';this.style.color='#884';this.style.cursor='#884'");
                e.Row.Attributes.Add(
"onmouseout", "this.style.backgroundColor='Red';this.style.color='black';this.style.cursor='blue'");

            }

            
else if (tempdate > 841)
            
{
                e.Row.BackColor 
= Color.Turquoise;
                e.Row.Attributes.Add(
"onmouseover", "this.style.backgroundColor='#CDCD00';this.style.color='#884';this.style.cursor='#884'");
                e.Row.Attributes.Add(
"onmouseout", "this.style.backgroundColor='Turquoise';this.style.color='black';this.style.cursor='blue'");
            }

            
else
            
{
                e.Row.BackColor 
= Color.White;
            }

         }

     }

    

 

posted @ 2008-07-29 15:11 铁山 阅读(5) | 评论 (0) | 编辑

2008年6月20日

Keep Persist Security Info as False

Setting Persist Security Info to true or yes will allow security-sensitive information, including the userid and password, to be obtained from the connection after the connection has been opened. If you are supplying a userid and password when making a connection, you are most protected if that information is used to open the connection, and then discarded. As a result, your option that helps to provide greater security is to set Persist Security Info to false or no.

This is especially important if you are supplying an open connection to an untrusted source or persisting connection information to disk. Keeping Persist Security Info as false helps ensure that the untrusted source does not have access to the security-sensitive information for your connection and also helps ensure that no security-sensitive information is persisted to disk with your connection string information.

Persist Security Info is false by default.

posted @ 2008-06-20 14:43 铁山 阅读(14) | 评论 (0) | 编辑

2008年5月26日

一段代码

//下面的代码是当你的程序开启后却长时间没操作,提示是否退出程序!  
  public   class   Form1   :   System.Windows.Forms.Form,System.Windows.Forms.IMessageFilter  
  //.......  
  Application.Idle+=new   EventHandler(FrmParent.IdleFun);  
  Application.AddMessageFilter(FrmParent);  
  Application.Run();   //   启动独立的应用程序线程  
  //...........  
  //用于程序长时间打开,却无操作,退出程序  
  private   void   timer1_Tick(object   sender,   System.EventArgs   e)  
  {  
  //这个程序是当程序没有在监听指令状态时,而且时间超过1小时后,自动退出!  
  if(++count>60*60)  
  {  
      timer1.Stop();  
       
  if   (MessageBox.Show   ("你打开程序时间很长,却没有任何操作,是否退出应用程序?",   "终端模拟程序", MessageBoxButtons.YesNo,   MessageBoxIcon.Question)==   DialogResult.Yes)    
  {  
                                        timer1.Dispose();  
  Application.Exit();  
   
  }  
  else  
  {  
   
  count=0;  
    }  
              }  
      }  
  }  
   
  private   void   IdleFun(object   o,System.EventArgs   e)  
  {  
  timer1.Start();  
  }  
   
  public   bool   PreFilterMessage(ref   System.Windows.Forms.Message   m)  
  {  
   
  if(m.Msg!=0x0113)  
  {  
  timer1.Stop();  
  count=0;  
   
  }

posted @ 2008-05-26 17:00 铁山 阅读(4) | 评论 (0) | 编辑

2008年5月11日

使用DateDiff函数

DateDiff函数 是一个非常有用的函数,它可以为一些网页做一些特殊的效果.
    我就曾用到它和一张'new'字样的图片 来区别网页显示的信息是否为最近的信息.
例如:提示最近的通知,最近的新闻等等.
    下面从DateDiff函数的定义来看看:

DateDiff函数返回 Variant (Long) 的值,表示两个指定日期间的时间间隔数目。

语法

DateDiff(interval, date1, date2[, firstdayofweek[, firstweekofyear]])

DateDiff 函数语法中有下列命名参数:

部分 描述

interval 必要。字符串表达式,表示用来计算date1 和 date2 的时间差的时间间隔

Date1□date2 必要;Variant (Date)。计算中要用到的两个日期。

Firstdayofweek 可选。指定一个星期的第一天的常数。如果未予指定,则以星期日为第一天。

firstweekofyear 可选。指定一年的第一周的常数。如果未予指定,则以包含 1 月 1 日的星期为第一周。

设置

interval 参数的设定值如下:

设置 描述

yyyy 年

q 季

m 月

y 一年的日数

d 日

w 一周的日数

ww 周

h 时

n 分钟

s 秒

firstdayofweek 参数的设定值如下:

常数 值 描述

vbUseSystem 0 使用 NLS API 设置。

vbSunday 1 星期日(缺省值)

vbMonday 2 星期一

vbTuesday 3 星期二

vbWednesday 4 星期三

vbThursday 5 星期四

vbFriday 6 星期五

vbSaturday 7 星期六

常数 值 描述

vbUseSystem 0 用 NLS API 设置。

vbFirstJan1 1 从包含 1 月 1 日的星期开始(缺省值)。

vbFirstFourDays 2 从第一个其大半个星期在新的一年的一周开始。

vbFirstFullWeek 3 从第一个无跨年度的星期开始。

说明

DateDiff 函数可用来决定两个日期之间所指定的时间间隔数目。例如,可以使用 DateDiff 来计算两个日期之间相隔几日,或计算从今天起到年底还有多少个星期。

为了计算 date1 与 date2 相差的日数,可以使用“一年的日数”(y) 或“日”(d)。当 interval 是“一周的日数”(w) 时,DateDiff 返回两日期间的周数。如果 date1 是星期一,DateDiff 计算到 date2 为止的星期一的个数。这个数包含 date2 但不包含 date1。不过,如果 interval 是“周”(ww),则 DateDiff 函数返回两日期间的“日历周”数。由计算 date1 与 date2 之间星期日的个数而得。如果 date2 刚好是星期日,则 date2 也会被加进 DateDiff 的计数结果中;但不论 date1 是否为星期日,都不将它算进去。

如果 date1 比 date2 来得晚,则 DateDiff 函数的返回值为负数。

firstdayofweek 参数会影响使用时间间隔符号 “W” 或 “WW” 计算的结果。

如果 date1 或 date2 是日期文字,则指定的年份成为该日期的固定部分。但是,如果 date1 或 date2 用双引号 (" ") 括起来,且年份略而不提,则在每次计算表达式 date1 或 date2 时,当前年份都会插入到代码之中。这样就可以书写适用于不同年份的程序代码。

在计算 12 月 31 日和来年的 1 月 1 日的年份差时,DateDiff 返回 1 表示相差一个年份,虽然实际上只相差一天而已。
 

在看完上面的介绍,我们在使用时,例如:在GridView 或者 DateList 绑定数据的后面加上一句

<img src='<%#(Convert.ToInt16(DataBinder.Eval(Container.DataItem,"DayCount"))<3)?"images/new.gif":"images/none.gif" %>' border="0">

在后台代码中:
绑定数据时SQL语句用
string sql="Select top 10  tid,title,datediff(day,tdate,getdate()) as DayCount  from  tb order by tid desc"

其中 tdate 是你发布信息的时间,  DayCount就是当前时间与发布信息时间的间隔,  上例中选间隔时间在3天内的 标记一个"new"图片.

posted @ 2008-05-11 16:14 铁山 阅读(15) | 评论 (0) | 编辑

2008年5月7日

[转]ADO.NET中的视图和过滤器(详解DataView用法)


ADO.NET中有一层对象,用来创建任意数据源的抽象模型。其中包括DataSet,DataTable,DataRow,DataView,DataRelation等等。

所有这些对象都定义在System.Data名字空间。它们形成一个抽象模型,使得无论针对Windows Form,Web Form还是Web Service进行编程,都可以使用相同的编程接口。
在实际应用中,这些对象大多会对诸如SQL Server一类的关系型数据库中的数据进行操作。但是,它们可以处理各种数据,而不管它的物理存储媒介。
你可以使用DataSet对象来打包和关联各表中的数据,用DataTable类来处理表格类型的数据,而DataRow对象可以处理表中某一行的数据。
这三个对象都是对数据进行打包,但有不同的逻辑聚合层次。DataSet是DataTable和其他的组合。而DataTable是DataRow和其他的组合。DataRow是字段和其他的组合。但是这些对象中都没有内建过滤和排序的功能。
ADO.NET提供了一些类来处理这个数据库应用程序中的重要方面。在.Net Beta2中,这方面最重要的两个对象就是DataView和DataViewManager。
注意:DataViewManager是Beta2中特有的。在Beta1中,相应的功能由DataSetView完成。

定制数据视图
DataView类用来表示定制的DataTable的视图。DataTable和DataView的关系是遵循著名的设计模式--文档/视图模式,其中DataTable是文档,而Dataview是视图。
在任何时候,你都可以有多个基于相同数据的不同的视图。更重要的是,你可以对每一个具有自己一套属性、方法、事件的视图作为独立的对象进行处理。这也代表了相对ADO一个巨大的飞跃。
ADO Recordset可以定义过滤字符串。一旦你建立了该字符窜,只有匹配特定标准的数据才能够进行读写。Filter属性的工作原理同动态WHERE子句很相似。它只是简单的在同一recordset对象视图上隐藏了某些记录。
在ADO中,你从没有一个独立的视图对象。一个过滤过的recordset总是同一个对象,只不过显示出的记录比它实际数量少一些而已。
如果你不需要同时处理一些不同的视图,上述问题并不要紧。编程接口赋予了recordset既可以是表也可以是视图的功能。但是在创建时,这不能同时发生。在某一特定时刻,recordset只能是没有过滤字符串的表或者是激活了过滤字符串的视图。
Recordset的克隆提供了较好解决这个结构限制的方法。正如Clonation and the Case of Table Dolly, Part 1中所说的,克隆recordset相对开销较少,因为它不复制数据,只是复制recordset的基本构造。要处理同一数据两个或两个以上的视图,你可以利用两个或两个以上克隆,各自有一套相应的过滤字符串。


图一 在ADO中处理同一recordset不同的视图
在ADO.NET中,你可以使用新型对象模型所提供的DataView对象。ADO.NET的DataView对象用来表示给定数据表的定制的视图,但你可以像处理单独的对象一样处理它。DataView对象保留了对表的一个引用并允许对它进行更新。


图二 在ADO.NET中对同一数据表的不同视图进行操作
功能上而言,使用ADO Recordset克隆与使用特殊的视图对象完成的是同样的功能,都是让你实现过滤,对所选的数据行进行操作,并同时处理多个视图。

深入DataView对象
DataView对象继承了MarshalByValueComponent并实现了一组接口使之在数据绑定控件中可用。
Public Class DataView
Inherits MarshalByValueComponent
Implements IBindingList, IList, ICollection,IEnumerable, _
ITypedList, ISupportInitialize

由MarshalByValueComponent派生的类是.NET远程组件,可以通过值来列集--即序列化对象到目标应用程序域。(详见以下关于.NET组件的更多细节)
DataView中的内容可以通过许多编程接口进行操作,包括集合,列表和枚举器。IBindingList接口确保了该类提供所有用来支持复杂的和简单的数据绑定的必要特征。
总的来说,DataView对象可以用来达到两个目的。第一,视图对于关联DataTable对象和数据绑定控件中的DataSource域是很重要的。第二,它也对连接的DataTable提供了一层包装,让你能够进行过滤,排序,编辑和浏览。
DataView并不是唯一的可以通过传值进行远程操作的数据驱动类。DataSet和DataTable也具有同样的能力,特别是在互操作的场景下。

创建DataView
public DataView();
public DataView(DataTable);

DataView只有同已经存在的、很可能是非空的DataTable对象连接后才可用。通常,这个连接在构造时就指定了。
DataView dv;
dv = new DataView(theDataSet.Tables["Employees"]);

但是,你也可以先创建一个新的视图,然后再用Table属性同表相关联。
DataView dv = new DataView();
dv.Table = theDataSet.Tables["Employees"];
DataView构造函数使你由DataTable中得到一个DataView对象。如果需要,反之亦可。事实上,DataTable对象的DefaultView属性返回一个该表的DataView对象。
DataView dv = dt.DefaultView;

一旦你有了DataView对象, 你可以利用它的属性来建立你希望用户见到的数据行集。一般,你可以使用下列属性:
  • RowFilter
  • Sort
前者可以定制视图中可见数据应匹配的规则。而后者通过表达式来进行排序。当然你可以使用这两者的任意组合。

设置过滤 RowFilter是一个可读写的属性,用来读取和设置表过滤的表达式。
public virtual string RowFilter {get; set;}

你可以用列名,逻辑和数字运算符和常量的任意合法组合组成表达式。以下是一些例子:
dv.RowFilter = "Country = 'USA'";
dv.RowFilter = "EmployeeID >5 AND Birthdate < #1/31/82#"
dv.RowFilter = "Description LIKE '*product*'"

让我们来看一下过滤器的基本规则和运算符。
过滤字符串是表达式的逻辑连接。可以用AND,OR,NOT来连接成一个较短的表达式,也可以使用圆括号来组成子句,指定优先的运算。
通常包含列名的子句同字母、数字、日期或另一个列名进行比较。这里,可以使用关系运算符和算术运算符,如>=, <, >, +, *, % (取模)等等。
如果要选取的行并不能方便地通过算术或逻辑运算符表达,你可以使用IN操作符。以下代码显示如何选取一个随机行:
dv.RowFilter = "employeeID IN (2,4,5)"

你也可以使用通配符*和%,它们同LIKE运算符一起使用时显得更有用。它们都表示任意数量的字符,可以相互替代使用。
请注意,如果在LIKE子句中已经有了*或%字符,你必须用方括号将其括起,以免歧义。如果很不幸,字符串中方括号本身也存在了,那么它也必须用将本身括起。这样,匹配语句会如下所示:
dv.RowFilter = "Description LIKE '[[]*[]]product[[]*[]]"

通配符只允许在过滤字符串的开头或结尾处使用,而不能在字符串中间出现。例如,下列语句会产生运行时错误:
dv.RowFilter = "Description LIKE 'prod*ct"

字符串必须以单引号括起,而日期型必须以#符号括起。字符型值可以使用小数点和科学计数法。
RowFilter也支持聚合函数,如SUM, COUNT, MIN,MAX, and AVG。如果表中没有数据行,那么函数将返回NULL。
在介绍RowFilter表达式的最后,让我们讨论三个很便利的函数:Len,IIF和Substring。
正如其名,Len()返回特定表达式的长度。该表达式可以是一个列名,也可以是其他合法的表达式。
Substring()返回指定的表达式自特定位置开始,特定长度的字符子串。
我最喜欢用的是IIF(),它按照逻辑表达式的值有一到两个值。IIF是IF-THEN-ELSE语句的紧凑表达。语法如下:
IIF(expression, if_true, if_false)

通过该函数,可以建立非常复杂的过滤字符串。例如,假定你从SQL Server的Northwind数据库中取得Employees表,下列表达式可以选出那些employeeID小于6且lastname为偶数个字符和employeeID大于6且lastname为奇数个字符的员工。
IIF(employeeID<6, Len(lastname) %2 =0, Len(lastname) %2 >0)

下图显示了结果(样品应用程序会在稍后讨论)

图三 对Northwind中的表进行过滤
例子程序是一个Windows® Form应用程序,其中使用了两个datagrid
控件来实现master/detail结构。一个grid在载入时生成,即在SQL
Server data adapter完成数据读取工作之后。请注意,data
adapter是Beta 2中引入的,在Beta 1中相应的是SQLDataSetCommand类。


预排视图
在上面的举例中,datagrid必须负责预排视图中的数据行,以便刷新用户界面。这个自动机制是.NET
数据绑定的产物。Datagrid是通过DataSource属性来获取数据的数据绑定控件。DataView是一个可数据绑定的类,可构建DataSource属性的内容。

如果你想使用datagrid之外的另一个控件,应该怎么办呢?又如果你不想使用自动数据绑定呢?应该怎样预排视图中所选的数据行呢?

DataView的Table属性指向相应的数据表,但DataTable并不保存过滤信息。所以,预排表中的数据注定是不可行的。虽然DataTable和DataView是紧密相联的,但它们各自保持独立,并执行独立的功能。

以下Visual Basic .NET代码段显示了如何遍历视图中所有的数据行,并加入到listbox中。
Dim dv As New DataView()
dv = ds.Tables("Employees").DefaultView
dv.RowFilter = "employeeid >5"

ListBox1.Items.Clear()
Dim buf As String
Dim dr As DataRowView
For Each dr In dv
buf = ""
buf &= dr("lastname").ToString()& ", " & dr("firstName").ToString()
ListBox1.Items.Add(buf)
Next

正如前面说提到的,DataView是可枚举的类,因此你可以安全的将它传给For..Each语句。Count属性存储了视图中数据行数,以便在For..Next循环中使用。
要访问视图中某一行,可以使用DataRowView类。DataRowView可表示DataRow的视图,就像DataView表达DataTable定制的视图一样。
总的来说,DataRow最多有四种状态:default,original,current和proposed。这些状态由DataRowVersion枚举类型设置,由RowVersion属性表达。
DataRow的视图只能是其中某一种状态。
数据行的默认(default)版本只有当其列在构造时设定了默认值时才有。而初始(original)版本是指在最后一次调用表的AcceptChanges后,从数剧源中得到数据行或快照。当前(Current)版本是指当前的数据行,包括所有当时发生的更新。Proposed状态只存在于调用BeginEdit和EndEdit的编辑过程中。
可以通过访问DataRow相同的语法访问DataRowView。这里最重要的属性叫Item。

排序和其他便捷的特性
DataView支持Sort属性,可以用来对视图中的内容排序。Sort由用逗号分隔的列名表达式进行排序。通过在任何列名后加ASC或者DESC限定词,可以使得字段按照上升或者下降的顺序排列。如果没有方向限定词,默认顺序为ASC。
DataView是内存中的对象,所以排序在本地进行,无需调用数据库服务器。
RowStateFilter是DataView另一有趣的属性。它可以用任何预定义的标准来过滤DataTable中的内容。下表中是DataViewRowState枚举类型的所有取值:
CurrentRows 包括所有未更新的、新的和修改的数据行
Deleted 所有自上次调用AcceptChanges后删除的数据行
ModifiedCurrent 所有自上次调用AcceptChanges后修改过的数据行
ModifiedOriginal 所有自上次调用AcceptChanges后original版本的数据行
New 所有自上次调用AcceptChanges后新添加的行
OriginalRows 返回初始数据行,包含unchanged和deleted 的
Unchanged 所有未更新的数据行

如果要操作非连接的数据,所有更新都在对DataTable调用AcceptChanges后生效。对单一行的更新在调用DataRow的AcceptChanges后生效。类似的,这些更新可以通过调用DataTable或DataRow对象的RejectChanges来取消。
DataView对象还有一些属性,如AllowEdit,AllowDelete和AllowNew,用来得到或设定是否允许更新的值。它们的默认值设为True,允许任何种类的更新。如果在标志设为False时,你想要完成相应的更新操作,会有一个运行时错误发生。

DataViewManager类
DataTable对象的DefaultView属性用来返回一个DataView对象,作为数据表中内容的默认视图。它按照自然顺序读取数据并显示表中所有的行,而不使用任何过滤。
theMasterGrid.DataSource = m_ds.Tables("Employees").DefaultView

如果需要数据特定的视图,你可以进行排序并/或对DefaultView对象直接进行过滤。
m_ds.Tables("Employees").DefaultView.Sort = "lastname"
theMasterGrid.DataSource = m_ds.Tables("Employees").DefaultView
DataViewManager类是用来存储DataSet中所有表的视图设置。
可以通过传递一个合法的非空的DataSet给类的构造函数来创建DataViewManager
Dim dvm As DataViewManager
dvm = New DataViewManager(m_ds)

也可以通过DataSet对象的DefaultViewManager属性直接得到:
Dim dvm As DataViewManager = m_ds.DefaultViewManager

重要的是DataViewManager类是同一个DataSet相关联的。下面是另一种可行的方法:
Dim dvm As New DataViewManager()
dvm.DataSet = m_ds

DataViewManager最重要的属性是DataViewSettings,一个DataViewSetting对象的集合。

Dim dvs As DataViewSetting
dvs = dvm.DataViewSettings("Employees")
dvs.Sort = "lastname"

DataViewSetting对象包含了表视图的参数信息。当将数据绑定到对数据敏感的控件时,使用DataViewManager而不是DataSet或DataTable可以保留你的视图设置(过滤和排序字段)

theMasterGrid.DataSource = dvm
theMasterGrid.DataMember = "Employees"

在这里,视图按照DataViewSetting中对Employees表指定的自动进行排序和过滤。换而言之,DataViewSetting类是对特定表的视图的一种缓存。

下一步
上述例子程序用filter实现了master/detail结构。如果使用.NET中特有的数据绑定控件(如datagrid),能够更好的达到这个目的。在以后的专栏中,我将论述内存中的数据关系,以及它们是如何影响master/detail结构的设计的。
对话:你是否需要控件或组件?

在.NET中有很多术语经常可以替代使用。这里特别指出的是:类,组件,对象和控件。在此,我提供了一张表,来表述每个术语的恰当的含义。我们经常将它们当成同义词。


需要牢记在心的是整个.NET架构是由类组成的。所以你从中得到的任何东西,首先,是一个类。在.NET环境中,控件和组件不是同一种类。至于对象,可以认为是运行着的.NET类的实例。
组件是一个特殊的类,它实现了Icomponent接口或派生于实现了Icomponent接口的类。
控件是提供了用户界面功能的组件。在.NET架构中,可以找到两类控件:客户端的Windows Forms 控件和ASP.NET server 控件。
Icomponent接口包含在Idisposable接口中,并提供了一种确定的方法清除资源。
Public Interface IComponent
Inherits IDisposable

这种释放资源的方法和标准的.NET垃圾收集器可以二者选一。通过实现Idisposable,你定义了一个Dispose方法。这样通过编程,你可以显式的释放对象而无须等待垃圾收集器来处理。
.NET组件知道怎样在应用程序域(application domain)中如何串联。这有两种方法:通过引用或通过值,基本功能分别内建于MarshalByRefComponet和MarshalByValueComponent类中。.NET component类,事实上,实现了Idisposable,但直接或间接继承了上述两个类中的一个。
应用程序域是一种轻量级进程。通过引用来列集对象意味着proxy/stub实体对会被创建并处理远程调用。而通过值则意味着该对象的序列化的拷贝传递越过域的边界。
控件是更特殊化的对象,它还提供了用户界面元素。当然,一个控件总是一个component,但反之不一定成立。

posted @ 2008-05-07 11:41 铁山 阅读(22) | 评论 (0) | 编辑

2008年4月22日

从客户端中检测到有潜在危险的 Request.Form 值的解决方法

今天遇到这个错误!
 原来是 .Net Framework 1.1中新增的功能, 防止恶意脚本攻击.

  解决方法有两种:
  方法1. 在.aspx页面中添加:
VS2003:
<%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="VS2003.WebForm1" validateRequest="false" %>
 
VS2005:
<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" validateRequest="false" %>

 
  方法2. 修改Web.Config文件:
  < CONFIGURATION>
   < SYSTEM.WEB>
    < PAGES validateRequest="false" />
   < /SYSTEM.WEB>
  < /CONFIGURATION>

posted @ 2008-04-22 15:49 铁山 阅读(13) | 评论 (0) | 编辑

DXControls.dll的使用

使用方法:

1.首先引用DXControls.dll程序集
 把DXControls.dll拷到网站的Bin目录,或在VS2005中添加引用选择文件DXControls.dll。
2。为使正确使用这一编辑器,在配置文件中添加以下内容:
  <system.web>
      .......
    <globalization requestEncoding="gb2312" responseEncoding="gb2312"/>
    </system.web>
3.如何在网页中使用编辑器
 (1)在网页中注册这个控件:
    <%@ Register Assembly="DXControls" Namespace="DXControls" TagPrefix="cc1" %>
     // "cc1" 为标签名称
 (2)使用控件:
    <cc1:DXTB ID="ContentTxt" runat="server"  Path="dxtb"  Width="600px" Height="300px" />
            // Path 为 dxtb 的目录,默认为网站目录下的 dxtb 目录
 (3)获取编辑器中的内容使用:
    ContentTxt.Text;
  注:另一用法是把这个控件添加到工具栏,直接拖出来用。

posted @ 2008-04-22 15:45 铁山 阅读(22) | 评论 (0) | 编辑

仅列出标题  
 
Powered by:
博客园
Copyright © 铁山