商务智能.技术之路...

—— 专注于ASP.NET /.NET FrameWork/Silverlight, 专注于SQL Server 2005 , 专注于BI技术。分享是积累成长的开始......
posts - 78, comments - 5, trackbacks - 6, articles - 99
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

2008年4月15日

    在ASP.NET程序的权限设计中,遇到了一个问题,需要每个页面都调用一个公用的函数,改函数需要

在每一个页面执行的时候,自动检查使用者是否有该页面的使用权限,并且需要取得该页面上相关功能权

限,并回传该页面的Title对它作修改;还需要保存使用的访问记录方便查询。
    1、用什么方式,能够在编写ASPX的时候用最少的代码可以实现这一功能;
    2、用什么方式调用公用的函数,更方便处理;
    针对这些问题,第一个想到的就是ASP2.0中的MasterPage功能,因为在asp.net2.0下基本上都会使用

到MasterPage,在MasterPage的PageLoad事件中来处理用户权限的问题,这样每个页面引用MasterPage就

能够使用了;但是经过测试后发现,MasterPage的PageLoad事件竟然是发生在ContentPage的PageLoad之

后的,这就意味着这样做,使Content Page就无法在PageLoad事件中调用公用的函数。
    在使用过程中发现当新增aspx并使用CodeFile方式时,可以看到在CodeFile的CS文件中有这样的内容

,如下:
public partial class Default : System.Web.UI.Page
{
}
其中该Class继承了System.Web.UI.Page,这样我们就可以写一个Class来代替System.Web.UI.Page;这里

我们来创建一个这样的类。
1、首先在解决方案项目上按右鍵→加入新项→选择模板[类]→名称[PageBase.cs],如果你还没有启用

App_Code的文件夹,系统提示是否新增App_Code,并将该文件放入文件夹中,确定后,会在App_Code中增

加PageBase.cs文件,内容如下:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

/// <summary>
/// Summary description for PageBase
/// </summary>
public class PageBase
{
    public PageBase()
    {
        //
        // TODO: Add constructor logic here
        //
    }
}
2、接下来让PageBase继承System.Web.UI.Page,如下:
public class PageBase : System.Web.UI.Page
这样就可以使用page的相关事件了。
3、下一步添加一些函数和属性,用来测试这些方法,代码如下:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

/// <summary>
/// Summary description for PageBase
/// </summary>
public class PageBase : System.Web.UI.Page
{
    Boolean _IsBrwP = false;

    public PageBase()
    {
        //
        // TODO: Add constructor logic here
        //
    }

    public string SayHello(string inStr)
    {
        return "Hello, " + inStr;
    }

    public Boolean BrwP
    {
        get { return _IsBrwP; }
        set { _IsBrwP = value; }
    }

    public void ChkBrwP(string UID)
    {
        if (UID == "li")
        {
            BrwP = true;
        }
        else
        {
            BrwP = false;
        }
    }

    private void Page_Load(object sender, EventArgs e)
    {
        Response.Write("PageBase Load.<br>");
    }
}
4、新增一个aspx页面文件,用来测试PageBase,如下:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default2.aspx.cs" Inherits="Default2" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <asp:Button ID="btn1" runat="server" Text="设定UID为li" OnClick="btn1_Click" /><br />
            <asp:Button ID="btn2" runat="server" Text="设定UID为liu" OnClick="btn2_Click" /></div>
    </form>
</body>
</html>
5、修改Default2.aspx.cs文件,把原本默认继承System.Web.UI.Page改为继承PageBase,如下:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class Default2 : PageBase
{
    protected void Page_Load(object sender, EventArgs e)
    {
        string sUid = Request.QueryString["UID"];
        string sRc = this.SayHello(sUid);
        Response.Write("Default2.aspx Load.<br>");
        Response.Write(sRc + "<br>");
        this.ChkBrwP(sUid);
        Response.Write(this.BrwP.ToString());
    }
    protected void btn1_Click(object sender, EventArgs e)
    {
        Response.Redirect("default2.aspx?UID=li");
    }
    protected void btn2_Click(object sender, EventArgs e)
    {
        Response.Redirect("default2.aspx?UID=liu");
    }
}
6、按F5运行看测试结果。
从运行结果可以看出,PageBase的Page_Load事件在Default2.aspx的Page_Load之前,并且也可以通过this.的方式弹出PageBase定义的函数和属性进行选用。因此一些在页面Load之前要执行的公用函数代码,就可以通过这样的方式来处理。

 

posted @ 2008-04-15 08:34 赣江源| 编辑

2008年4月9日

当我们开发了不同的Web应用系统后,如果一个用户同时要使用多个Web应用系统,但是每个应用系统都需要输入自己的账号和密码,这对于用户来说太麻烦。为了方便用户使用,就需要做单点登录,只要登陆一个Web系统后,跳转到别的Web系统时不再需要输入账号和密码;但是为了考虑到系统的安全性,这样设计单点登录功能时需要考虑安全和易用性的兼顾。

下面的实现方式是通过SQL-Server数据库来实现,假如有两个Web系统,WebA和WebB,首先在数据库中设计一个数据表,用来存储登录的用户信息,这个数据需要两个系统都可以对其操作的,这个数据表应包含以下字段信息:
GUID:由NewId()生成,格式为:【504B1790-E93A-4445-B262-E73A113BF336】;
UserId:WebA或WebB的账号,当然WebA与WebB可以用相同的账号,或者是通过用户影射的方式来取;
TimeOut:过期时间,假设这个时间为生成该记录的时间+2分钟。也就是从WebA到WebB的过程,时间过期后这条记录无效。

接下来就是实现的步骤:
1、当WebA链接转向WebB时向数据库写入一条记录,例如:5ED095B8-350D-42C3-953B-9C53DED54AFD,user1,20080402165823
2、WebA 把生成的GUID传递给 WebB
3、WebB得到GUID后,从数据库表取回登陆用户信息,并判断现在时间没有大于20080402165823;
4、如果找不到,显示错误信息并拒绝登录,如果找到,直接登录WebB系统,并同时删除该条GUID信息;
在这个过程中,过期时间设置的越长越不安全,但是太短了又容易造成登录失败,所以需要根据具体情况来设定。

这就是一个很简单的实现方式,如果有更好的方式,请提出一起学习研究。

posted @ 2008-04-09 10:50 赣江源| 编辑

在ASP.NET开发中经常会使用到Web控件和HTML控件,如果想通过代码提取这些控件Render到客户端后生成的HTML样式的话可以通过如下的函数得到。
 1 public string RenderHTML(WebControl objWebCtrl)
 2     {
 3         try
 4         {
 5             System.IO.StringWriter sw = new System.IO.StringWriter();
 6             HtmlTextWriter html = new HtmlTextWriter(sw);
 7 
 8             objWebCtrl.RenderControl(html);
 9             return sw.ToString();
10         }
11         catch (Exception ex)
12         {
13             Console.WriteLine(ex.Message);
return "";
14         }
15     }
16 
17     public string RenderHTML(HtmlControl objHtmlCtrl)
18     {
19         try
20         {
21             System.IO.StringWriter sw = new System.IO.StringWriter();
22             HtmlTextWriter html = new HtmlTextWriter(sw);
23 
24             objHtmlCtrl.RenderControl(html);
25             return sw.ToString();
26         }
27         catch (Exception ex)
28         {
29             Console.WriteLine(ex.Message);
return "";
30         }
31     }
但是如果是GridView,可能在输出时会出现如下的提示信息:
'GridView1' 必须置于 runat=server 的标记中。
这需要在代码中增加:
public override void VerifyRenderingInServerForm(Control control)
{
}
如果GridView有分页时可能会出现如下的提示:
RegisterForEventValidation 只能在 Render(); 期间呼叫。
这个问题可以修改ASPX页面文件的<%Page%>实现,增加两个属性:

EnableEventValidation = "false" AutoEventWireup="true"


posted @ 2008-04-09 09:59 赣江源| 编辑

近期将IE升级为IE7后发现原来开发的程序会出现很多问题,其中有一个就是程序中的“关闭”窗口按钮空能,当IE7有多个选项卡打开后要关闭IE时会提示“是否关闭所有选项卡”的提示,以前的IE版本是没有这个功能提示的,经过多方查找和试验后发现如果要用程序控制关闭IE7时不出现这个提示的话需要多OPEN的时候作一个小小的处理。
IE6环境下的代码如下:
window.opener=null;
window.close();

IE7环境下需要变成:
window.open('','_self','');
window.close();

如果有其他更好的办法请告知。

posted @ 2008-04-09 09:38 赣江源| 编辑

2008年1月10日

在 ASP.NET AJAX 机制下,使用 UpdatePanel 控件有很好的用户体验,它可以让开发人员不用编写繁杂的 javascipt相关程序代码,就能享有 AJAX 的效果。一般包含在 UpdatePanel 中的子控件,如果子控件有执行 PostBack 操作时,UpdatePanel 的机制在前端会拦截 __doPostBack 操作,使得控件产生的 PostBack 都会经由 UpdatePanel 统一处理,以做到局部更新的效果。

可是有时候我们会需要透过 JavaScript 要求 UpdatePanel 做更新的操作,一般都会以为直接呼叫 __doPostBack 即可。

以一个实例来做测试,我们在页面的 UpdatePanel 放置一个 Label 来显示最新时间。然后通过HTML控件 Input (type=button) 在 onclick 直接调用 __doPostBack 事件函数。

        <asp:ScriptManager ID="ScriptManager1" runat="server" />
        
<div>
            
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
                
<ContentTemplate>
                    Server Time:
                    
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
                
</ContentTemplate>
            
</asp:UpdatePanel>
            
<input id="Button1" type="button" value="button" onclick="__doPostBack('','');" />
        
</div>
protected void Page_Load(object sender, EventArgs e)
    {
        Label1.Text 
= System.DateTime.Now.ToString();
    }

以上程序的实际执行并不如预期的那样,UpdatePanel 中的时间是更新了,但是页面却会有闪烁的效果,这个 PostBack 并没有受到 UpdatePanel 的控制。

经过后来的多次的测试后发现,其实只要做一点修改就可以达到页面不闪烁的效果,就是在 __doPostBack 函数的第一个参数 (eventTarget),传入 UpdatePanel 的 ClientID 即可。如下:

<input id="Button1" type="button" value="button" onclick="__doPostBack('UpdatePanel1','');" />

posted @ 2008-01-10 09:08 赣江源| 编辑

2008年1月9日

一般要取得 GridView 中的单元格值,都是要指定该单元格所在的行列索引,根据单元格在浏览或编辑模式下,需要使用不同的方式来获取。

例如有一个“地区”的 BoundField,它是 GridView 中的第3列,在浏览模式下取得“地区”列的值,如下:

GridViewRow.Cells(3).Text

如果是在编辑模式时,因为该列值是在 Cell 中的 TextBox中,所以要使用下列方式来提取编辑时“地区”列的值,如下:

CType(oRow.Cells(3).Controls(0), TextBox).Text

以上获取 GridView 单元格值的没有良好的通用性,只要改变列顺序或变更列的类型(例如变成 TemplateField),这样程序很容易就发生错误,如果有变化则程序也需要随时修改。

为了在实际应用中解决这个问题,经过几种方式的对比,感觉比较好的方式是以列名来提取值。DataControlField 有一个 ExtractValuesFromCell 方法,不论是浏览或编辑模式都可以简单的取出 Cell 的对应的列,也不用去管它使用那一种 DataControlField (BoundField 、 CheckBoxField 或 TemplateField ) 都可以正确的取得对应的单元格值。

下面的程序示例就是通过 ExtractRowValues 函数获取出 GridView 指定单元格的值。
C#.NET:

private OrderedDictionary ExtractRowValues(DataControlFieldCollection Columns, GridViewRow Row)
    {
        OrderedDictionary oFieldValues;
        OrderedDictionary oDictionary;
        DataControlField oColumn;
        
        oFieldValues 
= new OrderedDictionary(Columns.Count);
        oDictionary 
= new OrderedDictionary();

        
for (int i = 0; i < Columns.Count; i++)
        {
            oColumn 
= Columns[i];
            
if (oColumn.Visible)
            {
                oDictionary.Clear();
                oColumn.ExtractValuesFromCell(oDictionary, (DataControlFieldCell)Row.Cells[i], Row.RowState, 
true);
                
foreach (DictionaryEntry oEntry in oDictionary)
                {
                    oFieldValues.Add(oEntry.Key, oEntry.Value);
                }
            }
        }

        
return oFieldValues;
    }
    
    
protected void Button1_Click(Object sender, EventArgs e)
    {
        GridViewRow oRow;
        System.Collections.Specialized.OrderedDictionary oFieldValues;
        oRow 
= (GridViewRow)GridView1.Rows[1];
        oFieldValues 
= ExtractRowValues(GridView1.Columns, oRow);

        
//输出 “地区”名
        this.Response.Write(oFieldValues["地区"].ToString());
    }

VB.NET:
    ''' <summary>
    
''' 获取 GridView 指定列集合。
    
''' </summary>
    
''' <param name="Columns">列集合。</param>
    
''' <param name="Row">行。</param>
    Private Function ExtractRowValues(ByVal Columns As DataControlFieldCollection, ByVal Row As GridViewRow) As OrderedDictionary
        
Dim oFieldValues As OrderedDictionary
        
Dim oColumn As DataControlField
        
Dim oDictionary As OrderedDictionary
        
Dim oEntry As DictionaryEntry
        
Dim N1 As Integer

        oFieldValues 
= New OrderedDictionary(Columns.Count)
        oDictionary 
= New OrderedDictionary()

        
For N1 = 0 To Columns.Count - 1
            oColumn 
= Columns.Item(N1)
            
If oColumn.Visible Then
                oDictionary.Clear()
                oColumn.ExtractValuesFromCell(oDictionary, TryCast(Row.Cells.Item(N1), DataControlFieldCell), Row.RowState, 
True)
                
For Each oEntry In oDictionary
                    oFieldValues.Item(oEntry.Key) 
= oEntry.Value
                
Next
            
End If
        
Next

        
Return oFieldValues
    
End Function

    
Protected Sub Button1_Click(ByVal sender As ObjectByVal e As System.EventArgs)
        
Dim oRow As GridViewRow
        
Dim oFieldValues As OrderedDictionary

        oRow 
= CType(CType(sender, Control).BindingContainer, GridViewRow)
        oFieldValues 
= ExtractRowValues(GridView1.Columns, oRow)

        
'输出 “地区”名
        Me.Response.Write(oFieldValues("地区").ToString())
    
End Sub

posted @ 2008-01-09 13:59 赣江源| 编辑

2007年11月14日

如何在GridView将数字显示成金额格式或自定义格式呢?例如数字是123456.78,GRIDVIEW能否显示成123,456.78格式?
要自定义输出的内容,就只能使用自定义的模板.可以调用ToString()方法输出自定义格式的数据。然后使用ItemTemplate绑定到对应的列。最后通过<%#%>调用对应的函数来格式化显示的数据。
*.aspx代码如下:

<asp:GridView ID="GridView1" runat="server" OnPreRender="GridView1_PreRender" OnSelectedIndexChanged="GridView1_SelectedIndexChanged" AutoGenerateColumns="False">
            
<Columns>
                
<asp:TemplateField>
                
<ItemTemplate>
                
<%# toNumberGroup((int)Eval("c1")) %>
                
</ItemTemplate>
                
</asp:TemplateField>
            
</Columns>
        
        
</asp:GridView>

*.aspx.cs代码如下:
public string toNumberGroup(int i)
    {
        
return i.ToString("n", System.Globalization.CultureInfo.CurrentUICulture.NumberFormat);
    }

protected void Page_Load(object sender, EventArgs e)
    {
        DataTable dt 
= new DataTable();
        dt.Columns.Add(
"c1",typeof(int));
        dt.Columns.Add(
"c2");
        dt.Rows.Add(
new object[]{11111,2});
        dt.Rows.Add(
new object[]{222222,2});

        
this.GridView1.DataSource = dt;
        
this.GridView1.DataBind();
    }



posted @ 2007-11-14 16:39 赣江源| 编辑

在asp.net 2.0中,对XML的应用大为增强,而在XSLT处理方面,也提供了新的功能。在asp.net 2.0中,XSLT方面有如下的转变和新功能:

  ·XslCompiledTransform - 实际上是.NET 1.0的 XslTransform ,但提供了更好的性能支持,也支持之前.net 1.0下的应用的顺利迁移.

  ·XsltArgumentList - 允许向XSLT中传递参数或者对象

  XsltCompileException - 当通过loa()方法加载XSL文档时发生错误时产生的异常。

  XsltException - 当在对XSL文档进行解析时发生错误时产生的异常。

  先来看个简单的例子,该例子从NORTHWIND数据库中取出数据,以XML格式展示,再以XSLT格式转换为HTML格式显示,其中XSLT代码如下:

<?xml version="1.0" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" />
<xsl:template match="/">
<HTML>
<HEAD>
 <TITLE>Simple XSLT Transformation</TITLE>
</HEAD>
<BODY>
 <H2>Simple XSLT Transformation</H2>
 <table border="1" cellSpacing="1" cellPadding="1">
  <center>
  <xsl:for-each select="//Categories">
  <!-- Each record on a seperate row -->
  <xsl:element name="tr">
   <xsl:element name="td">
    <xsl:value-of select="ProductSubcategoryID" />
   </xsl:element>
  <xsl:element name="td">
 <xsl:value-of select="Name" />
 </xsl:element>
 <xsl:element name="td">
 <xsl:attribute name="align">center</xsl:attribute>
 <xsl:value-of select="ModifiedDate" />
 </xsl:element>
 </xsl:element>
 </xsl:for-each>
 </center>
 </table>
</BODY>
</HTML>
</xsl:template>
</xsl:stylesheet>

  然后其展示的ASPX代码为:

<%@ Page Language="C#" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<%@ Import Namespace="System.Xml" %>
<%@ Import Namespace="System.Xml.Xsl" %>
<%@ Import Namespace="System.Xml.XPath" %>
<%@ Import Namespace="System.Web.Configuration" %>
<script runat="server">
void Page_Load(object sender, System.EventArgs e)
{
 string connString = WebConfigurationManager.ConnectionStrings
["adventureWorks"].ConnectionString;
 using (SqlConnection connection = new SqlConnection(connString))
 {
  connection.Open();
  SqlCommand command = new SqlCommand
("Select * from Production.ProductSubcategory as Categories " +
" for xml auto,elements", connection);
  XmlReader reader = command.ExecuteXmlReader();
  XPathDocument xpathDoc = new XPathDocument(reader);
  string xslPath = Server.MapPath("Category.xsl");
  XslCompiledTransform transform = new XslCompiledTransform();
  transform.Load(xslPath);
  transform.Transform(xpathDoc, null, Response.Output);
 }
}
</script> 

  其中注意我们先用xmlreader读取数据库提出来的数据(以xml auto的方式),然后载入xsl文件,再用xslcompiledtransform类进行转换,其中用xpathdocument是为了性能的提升。注意这里用xslcompiledtransform取代了.net 1.1中的xslttransform,还可以向XSLT中传入参数或对象,先看如何向其传入参数,比如要改变上例的背景颜色,则可以这样写XSLT

<?xml version="1.0" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" />
<xsl:param name="BackGroundColor" select="Blue" />
<xsl:template match="/">
<HTML>
<HEAD>
<TITLE>Passing Parameters to an XSLT Style Sheet</TITLE>
</HEAD>
<BODY>
<H2> Passing Parameters to an XSLT Style Sheet</H2>
<table border="1" cellSpacing="1" cellPadding="1">
<center>
<xsl:for-each select="//Categories">
<!-- Each record on a seperate row -->
<xsl:element name="tr">
<xsl:attribute name="bgcolor">
<xsl:value-of select="$BackGroundColor" />
</xsl:attribute>
<xsl:element name="td">
<xsl:value-of select="ProductSubcategoryID" />
</xsl:element>
<xsl:element name="td">
<xsl:value-of select="Name" />
</xsl:element>
<xsl:element name="td">
<xsl:attribute name="align">center</xsl:attribute>
<xsl:value-of select="ModifiedDate" />
</xsl:element>
</xsl:element>
</xsl:for-each>
</center>
</table>
</BODY>
</HTML>
</xsl:template>
</xsl:stylesheet> 

  要注意的是其中的是:

<xsl:attribute name="bgcolor">
<xsl:value-of select="$BackGroundColor" />

  以这样的形式指定了backgroundcolor是一个参数,而在XSLT的一开始,以<xsl:param name="BackGroundColor" select="Blue" />的方式,为backgroundcolor设定了一个值为蓝色,这样则为使<tr>的背景颜色bgcolor=blue,实现将输出数据的每一行变为蓝色的效果。

posted @ 2007-11-14 09:18 赣江源| 编辑

2007年11月6日

代码如下:

//在GridView的RowCreated事件中

protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e)

  if (e.Row.RowType == DataControlRowType.Header) //如果是表头

    foreach (TableCell MyHeader in e.Row.Cells) //对每一单元格     

      if (MyHeader.HasControls())

        if (((LinkButton)MyHeader.Controls[0]).CommandArgument == GridView1.SortExpression)
        //是否为排序列

          if (GridView1.SortDirection == SortDirection.Ascending) //依排序方向加入方向箭头

            MyHeader.Controls.Add(new LiteralControl("↓"));

          else

            MyHeader.Controls.Add(new LiteralControl("↑"));

}

posted @ 2007-11-06 11:45 赣江源| 编辑

利用AJAX实现DropDownList与GridView做实时更新

本实例是完全用页面设置的方法,就可以达到的效果,不用编写任何后台代码,方便实用。需要先建立一个ASP.NET AJAX-Enabled Web Site,然后建立一个资料库,就可以使用了。

*.aspx:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="ddlGridview_CS.aspx.cs" Inherits="ddlGridview_CS" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Test</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:ScriptManager ID="ScriptManager1" runat="server">
        </asp:ScriptManager>
        <asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="True">
            <asp:ListItem Selected="True" Value="False">Active</asp:ListItem>
            <asp:ListItem Value="True">Complete</asp:ListItem>
        </asp:DropDownList>
        <asp:UpdatePanel ID="UpdatePanel1" runat="server">
            <ContentTemplate>
        <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="TaskID"
            DataSourceID="SqlDataSource1" CellPadding="4" ForeColor="#333333" GridLines="None">
            <Columns>
                <asp:BoundField DataField="TaskID" HeaderText="TaskID" InsertVisible="False" ReadOnly="True"
                    SortExpression="TaskID" />
                <asp:BoundField DataField="TaskName" HeaderText="TaskName" SortExpression="TaskName" />
                <asp:CheckBoxField DataField="Complete" HeaderText="Complete" SortExpression="Complete" />
            </Columns>
            <FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
            <RowStyle BackColor="#F7F6F3" ForeColor="#333333" />
            <EditRowStyle BackColor="#999999" />
            <SelectedRowStyle BackColor="#E2DED6" Font-Bold="True" ForeColor="#333333" />
            <PagerStyle BackColor="#284775" ForeColor="White" HorizontalAlign="Center" />
            <HeaderStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
            <AlternatingRowStyle BackColor="White" ForeColor="#284775" />
        </asp:GridView>
            </ContentTemplate>
            <Triggers>
                <asp:AsyncPostBackTrigger ControlID="DropDownList1" EventName="SelectedIndexChanged" />
            </Triggers>
        </asp:UpdatePanel>
        <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:DatabaseConnectionString %>"
            SelectCommand="SELECT * FROM [Tasks] where Complete = @IsComplete">
            <SelectParameters>
                <asp:ControlParameter ControlID="DropDownList1" Name="IsComplete" PropertyName="SelectedValue" />
            </SelectParameters>
        </asp:SqlDataSource>
  
    </div>
    </form>
</body>
</html>

posted @ 2007-11-06 11:40 赣江源| 编辑