1. 程式人生 > >為 ASP.NET Datagrid 建立自定義列

為 ASP.NET Datagrid 建立自定義列

Marcie Robillard
DatagridGirl.com

2003 年 9 月

簡介

不得不承認,為 Microsoft® ASP.NET 編寫 Datagrid 程式碼包括大量的重複工作。儘管我深受該控制元件的困擾,但我還是不斷尋找簡化這類任務的捷徑。誰都不願意做重複的工作,對不對?為了擺脫這種煩人的工作,我們要將多個專案中的重複程式碼封裝到一個可重複使用的程式包中。這才是面向物件的程式設計工作所要解決的問題,使用 Datagrid 也不例外。對於 Datagrid 控制元件來說,要實現該目的,需要將常用的程式碼放到一個內建的列型別中(將在第一個示例中使用),然後建立一個可以在多個 Datagrid 物件中重複使用的自定義列型別。

本文介紹使用標準 TemplateColumn 在一個 Datagrid 列中使用 DropDownList 控制元件的過程,然後將該邏輯轉換為您的自定義 Datagrid 列型別,我稱其為 DropDownColumn。已經為您建立了一些免費的 Datagrid 列,您可以到 MetaBuilders.com 下載所需的型別。

重複使用的情況

如果您的小組與許多組織一樣,已經將業務邏輯和/或資料訪問邏輯分成單獨的元件或元件集,而剩下的 ASP.NET 檔案、ASPX 及其程式碼只包含純粹的表示邏輯。(“純粹”是一個相對的詞語。)但是,即使是表示層的邏輯有時也會重複使用,這樣,下次某個使用者來到您門前說,“我想讓我的應用程式在‘財務’方面看起來與蘇茜的一樣”時,您可以重複使用“財務”應用程式的部分表示內容快速為其構建一個這樣的應用程式。您可能還想將一些邏輯打包,在 Web 上銷售或在您的 Web 站點分發。ASP.NET 使這一切比以往更容易實現,因為它使您可以建立自己的伺服器控制元件,或從現有的型別匯出列型別,從而獲得所需的功能。

DropDownList 方案

假設您正在本地 Microsoft SQL Server™ 中編輯 Northwind 資料庫(或做其他工作),您想使您的使用者(我們稱之為 Ed,倉庫保管員)可以編輯 Orders 表。其中一個欄位包含運輸資訊 (ShipVia),Ed 要能夠修改該欄位的資訊。在顯示模式下,運輸公司應顯示為純文字。當 Ed 單擊 Edit(編輯)按鈕時,您不光要為他提供一個 TextBox 以編輯運輸方式程式碼(1、2 或 3),還要為他提供一個包含可以選擇不同運輸公司的 DropDownList。(因為 Ed 記不住哪個運輸公司對應哪個號碼,所以,DropDownList 方案可以幫助他解決這個問題。)

圖 1:選擇運輸公司

內建的 Datagrid 列

瞭解問題的大概情況後,現在我們後退一步,看一下 ASP.NET 中構建的 5 種 Datagrid 列型別及其父型別 DataGridColumn

  • BoundColumn。這是文字欄位的標準顯示。它顯示為純文字,但是當 Datagrid 處於“編輯”模式時,它將轉換為 TextBox。還可以選擇格式化選項。
  • HyperlinkColumn。用於顯示文字資料,還代表一個 Web 地址 (URL)。URL 可以與顯示文字相同,也可以不同,它們都可以單獨設定。它顯示為 <a href=...> 標記。
  • ButtonColumn。它使使用者能夠按行與網格進行互動。它可以顯示為超連結 LinkButton (<a href=...>) 或 Pushbutton (<input type="button">)。單擊該按鈕時將觸發 PostBack,而在 Datagrid 上觸發 ItemCommand 事件。
  • EditCommandColumn。它與 ButtonColumn 類似,但是它自動建立用於編輯 Datagrid、取消或提交更改的按鈕。觸發 ItemCommand 事件,以及所單擊按鈕的特定事件:EditCommandCancelCommandUpdateCommand
  • TemplateColumn。用於完全控制顯示給使用者的控制元件,分為多種模板,例如 ItemTemplateEditItemTemplate。任何 ASP.NET 或 HTML 控制元件或控制元件組都可以放置在這些模板中。
注意:直接使用這些列型別之前,請關閉 AutoGenerateColumns(執行時自動生成列)。然後,您可以在屬性生成器中使用這些列型別,或者直接在 ASPX 檔案的 HTML 程式碼中使用。

圖 2:從 DataGridColumn 中繼承的 5 種內建列

儘管這些列型別非常有用,它們不過是瞭解 Datagrid 列內容的開始。

傳統方法:TemplateColumn 中的 DropDownList

在研究如何建立新列型別之前,首先讓我們看一下如何通過直接在 TemplateColumn 內使用 DropDownList 解決下拉列表的問題,而不用自定義列。ItemTemplate 將只包含表示當前值的純文字表示,而 EditItemTemplate 包含一個需要在執行時管理的 <asp:DropDownList> 控制元件。

<asp:DataGrid id="DataGrid1" 
   runat="server" CssClass="grid" 
   AutoGenerateColumns="False">
   <Columns>
      <asp:EditCommandColumn 
         EditText="Edit" CancelText="Cancel" 
         UpdateText="Update" />
      <asp:BoundColumn 
         DataField="OrderID" ReadOnly="True" 
         HeaderText="Order ID" />
      <asp:BoundColumn 
         DataField="ShipName" HeaderText="Ship to" 
         ReadOnly="True" />
      <asp:BoundColumn 
         DataField="ShipCountry" HeaderText="Country" 
         ReadOnly="True" />
      <asp:TemplateColumn HeaderText="Ship Method">
         <ItemTemplate>
            <%#Container.DataItem("ShipVia")%>
         </ItemTemplate>
         <EditItemTemplate>
            <asp:DropDownList runat="server" ID="Dropdownlist1"/>
         </EditItemTemplate>
      </asp:TemplateColumn>
   </Columns>
</asp:DataGrid>

繫結 Datagrid 的程式碼:

Sub BindGrid()
    Dim SQL As String = "SELECT OrderID, 
      ShipName, ShipCountry, ShipVia FROM Orders"
    Dim DA As SqlDataAdapter = New SqlDataAdapter(SQL, ConnStr)
    Dim DS As New DataSet
    DA.Fill(DS, "Orders")
    DataGrid1.DataSource = DS.Tables("Orders").DefaultView
    DataGrid1.DataBind()
End Sub

當前編輯的專案是在觸發 DatagridItemDataBound 事件時繫結到 DropDownList 的。使用 ItemDataBound 事件時,請檢查當前專案的 ListItemType,否則您可能會發現您正在使用 HeaderItem 或其他不適用的專案型別。為 EditItem 引用 DropDownList 控制元件。在下面的程式碼中,我直接使用單元格控制元件集進行說明(為了與後面的示例保持一致),但是,您可以採用簡單的方法,直接為 DropDownList 控制元件指定 ID,並使用 Datagrid 專案的 FindControl 方法定位控制元件引用。由於 Datagrid 被繫結到 DataTable 的預設檢視,而該檢視的元素屬於 DataRowView 型別,所以您可以將當前專案的 DataItem 屬性轉換為一個 DataRowView 例項。這樣,您可以按欄位名直接引用 DataItem 中的欄位。使用這種方法,將“ShipVia”的當前值儲存到該記錄中,並使用它選擇相應的下拉列表項。

Private Sub DataGrid1_ItemDataBound(ByVal sender As Object, _
    ByVal e As System.Web.UI.WebControls.DataGridItemEventArgs) _ 
      Handles DataGrid1.ItemDataBound
    If e.Item.ItemType = ListItemType.EditItem Then
        Dim DRV As DataRowView = CType(e.Item.DataItem, DataRowView)
        Dim CurrentShip As String = DRV("ShipVia")
        Dim DDL As DropDownList = _
      CType(e.Item.Cells(4).Controls(1), DropDownList)
        Dim SQL As String = _
      "SELECT ShipperID, CompanyName FROM Shippers ORDER BY ShipperID"
        Dim DA As SqlDataAdapter = New SqlDataAdapter(SQL, ConnStr)
        Dim DS As New DataSet
        Dim item As ListItem
        DA.Fill(DS, "Shippers")
        DDL.DataSource = DS.Tables("Shippers").DefaultView
        DDL.DataTextField = "CompanyName"
        DDL.DataValueField = "ShipperID"
        DDL.DataBind()
        item = DDL.Items.FindByValue(CurrentShip)
        If Not item Is Nothing Then item.Selected = True
    End If
End Sub

最後,編寫從 DropDownList 中檢索當前選定值的程式碼,並執行資料庫更新:

Private Sub DataGrid1_UpdateCommand(ByVal source As Object, _
   ByVal e As System.Web.UI.WebControls.DataGridCommandEventArgs) _
   Handles DataGrid1.UpdateCommand
    Dim DDL As DropDownList = _
      CType(e.Item.Cells(4).Controls(1), DropDownList)
    Dim NewShip As Integer = DDL.SelectedValue
    Dim OrderID As Integer = Int32.Parse(e.Item.Cells(1).Text)
    Dim SQL As String = _
      "UPDATE Orders SET [email protected] WHERE [email protected]"
    Dim Conn As SqlConnection = New SqlConnection(ConnStr)
    Dim Cmd As New SqlCommand(SQL, Conn)
    Cmd.Parameters.Add(New SqlParameter("@Ship", NewShip))
    Cmd.Parameters.Add(New SqlParameter("@ID", OrderID))
    Conn.Open()
    Cmd.ExecuteNonQuery()
    Conn.Close()
    DataGrid1.EditItemIndex = -1
    BindGrid()
End Sub

所有列的基礎:DataGridColumn

我們回顧一下所有內建列型別的父型別 DataGridColumn。(參見圖 1。)它包含所有 Datagrid 列中常用的屬性和方法。帶星號的型別表示您建立自定義列型別時要使用的型別。

DataGridColumn 屬性

  • FooterStyle (TableItemStyle)
  • FooterText(字串)
  • HeaderImageUrl(字串)
  • HeaderStyle (TableItemStyle)
  • HeaderText(字串)
  • ItemStyle (TableItemStyle)
  • SortExpression(字串)
  • Visible(布林值)

DataGridColumn 方法

  • Initialize
  • InitializeCell
  • LoadViewState
  • OnColumnChanged
  • SaveViewState
  • TrackViewState

可重複使用的方法:建立 DropDownColumn

首先要在 Microsoft® Visual Studio® .NET 中建立一個新類庫,並將其命名為 MyCustomColumn。新增一個新類 DropDownColumn,並確保在您的類定義中新增名稱空間,這樣您的初始程式碼應如下所示:

Namespace MyCustomColumn
    Public Class DropDownColumn
        Inherits DataGridColumn

        Public DataSource As ICollection
        Public DataField As String
        Public DataTextField As String
        Public DataValueField As String

    End Class
End Namespace

我還聲明瞭 4 個公共屬性,如下所示:

  • DataSource。它是用來填充 DropDownList 的資料集。可以是實現 ICollection 介面的任何內容。在本文的示例中,我使用 ArrayListDataView
  • DataField。它是父 Datagrid 資料來源中的欄位,它與從下拉列表中選定的資料相對應。例如,如果 DataSource 包含一個狀態集,DataField 將類似於“StateCode”,也可以在表格中使用狀態隨意命名欄位。
  • DataTextField。這是要顯示在下拉列表中的文字,可以是下面的值,也可以不是。
  • DataValueField。這是表示特殊下拉選項的值。DataValueField 通常是一個整數值或其他程式碼,而 DataTextField 是對使用者來說更有意義的文字說明。

接下來,覆蓋 InitializeCell,它是 Datagrid 列的一個固有事件。列中的所有單元格都將發生 InitializeCell,它與直接使用 Datagrid 時的 ItemCreated 事件非常相似。您可以使用它來管理單元格內容,例如設定 HeaderText,新增您將向其中新增資料的 DropDownList 控制元件。我已經為單元格的 DataBinding 事件添加了處理程式,需要根據當前是否正在編輯行來採取不同的處理方式。每個 System.Web.UI.Control 都有一個 DataBinding 事件,當資料被繫結到控制元件時,您可以從這裡訪問底層的資料,本例中為 Datagrid 中的 TableCell 物件。

Public Overrides Sub InitializeCell(ByVal cell As TableCell, _
   ByVal columnIndex As Integer, _
   ByVal itemType As ListItemType)
       MyBase.InitializeCell(cell, columnIndex, itemType)
       Select Case itemType
              Case ListItemType.Header
                   cell.Text = HeaderText
              Case ListItemType.Item, ListItemType.AlternatingItem
                   AddHandler cell.DataBinding, AddressOf ItemDataBinding
              Case ListItemType.EditItem
                   AddHandler cell.DataBinding, AddressOf EditItemDataBinding
                   Dim DDL As New DropDownList
                   cell.Controls.Add(DDL)
            End Select
        End Sub

接下來是 ItemDataBinding 例程,當對 Datagrid 中的 Item 或 AlternatingItem 進行資料時,將觸發該例程。您需要引用回正在繫結的 TableCell,可以直接轉換傳遞給事件的“傳送者”物件,再使用 TableCellNamingContainer 屬性引用當前的 DataGridItem。這裡只能以純文字格式顯示 DataField 的內容,就象顯示在 BoundColumn 中一樣。最後,如果使用者指定的欄位不存在,我將為使用者顯示更友好的錯誤資訊,而不是僅僅顯示“索引超出範圍”這樣的一般資訊。

Private Sub ItemDataBinding(ByVal sender As Object, ByVal e As EventArgs)
     Dim cell As TableCell = CType(sender, TableCell)
     Dim DGI As DataGridItem = CType(cell.NamingContainer, DataGridItem)
     Try
          cell.Text = DGI.DataItem(DataField)
     Catch RangeEx As IndexOutOfRangeException
          Throw New Exception("Specified DataField was not found.")
     Catch OtherEx As Exception
          Throw New Exception(OtherEx.InnerException.ToString)
     End Try
 End Sub
 

下一步,編寫 EditItemDataBinding 事件的程式碼,當某個行進入“編輯”模式時,將在我們的自定義列單元格上觸發該事件。再次引用當前單元格並在呼叫 InitializeCell 方法時插入 DropDownList 控制元件。在 DropDownList 中新增一個空專案作為第一個選項,如果列中的當前資料與您從 DataSource 集合中選擇並放在列表中的任何專案都不匹配,則選擇該選項。

然後,需要確定所傳入集合的型別。在本例中,我將處理兩種情況:通過 ArrayList 傳遞一組字串,或者資料表中的 DataView,它由 DataRowView 專案構成。對於字串資料,我將輸入一個新的 ListItem,並設定下拉項的值和文字。由於這兩種情況是相同的,所以這裡只需要文字。但是我將選擇相應的專案來根據值作出選擇,以便與下一個示例保持一致,下一個示例將設定一個單獨的值屬性。對於 DataRowView 專案,上一個示例中已指出,DataRowViewInstance("FieldName") 返回一個表示該欄位中的資料的物件。可以使用同樣的方法檢索 DataTextFieldDataValueFields 需要的值。

最後,丟擲一些異常以處理開發人員使用列時遇到的常見錯誤,例如向 DataField 屬性發送無效欄位名,或傳入不相容的 DataSource 型別。我已經對要彈出的異常訊息進行了硬編碼,但希望您在實際的應用程式中將這些訊息儲存到更容易配置的位置。例如,如果您希望在全球範圍內使用您的應用程式,則可以儲存到您的 web.config 檔案或資原始檔中。同樣,您不一定非要再次丟擲“未找到指定的 DataField”異常,因為在 Datagrid 被置於“編輯”模式之前可能已經在 ItemDataBinding 事件中捕獲了該異常。

Private Sub EditItemDataBinding(ByVal sender As Object, _
ByVal e As EventArgs)
            Dim cell As TableCell = CType(sender, TableCell)
            Dim DDL As DropDownList = _
CType(cell.Controls(0), DropDownList)
            Dim DataSourceItem As Object
            Dim item As ListItem
            Dim DGI As DataGridItem

            '首先新增一個空選項
            DDL.Items.Add(New ListItem(""))
            For Each DataSourceItem In DataSource
                Select Case DataSourceItem.GetType.ToString
                    Case "System.String" '應用到 ArrayList 示例
                        item = New ListItem(DataSourceItem, DataSourceItem)
                        DDL.Items.Add(item)
                    Case "System.Data.DataRowView"
                        Dim DRV As DataRowView = _
                           CType(DataSourceItem, DataRowView)
                        item = New_
              ListItem(DRV(DataTextField), DRV(DataValueField))
                        DDL.Items.Add(item)
                    Case Else
                        Throw New Exception("Invalid DataSource type.")
                End Select
            Next

            Try
                DGI = CType(cell.NamingContainer, DataGridItem)
                item = DDL.Items.FindByValue(DGI.DataItem(DataField))
            Catch RangeEx As IndexOutOfRangeException
                Throw New Exception("Specified DataField was not found.")
            Catch OtherEx As Exception
                Throw New Exception(OtherEx.InnerException.ToString)
            End Try

            If Not item Is Nothing Then item.Selected = True
End Sub

使用 DropDownColumn

以上是建立 DropDownColumn 類所需的所有程式碼,下面我們看一看如何在應用程式中使用該控制元件。如果您是在家中學習,而且還沒有開始做,請將上面建立的名稱空間編譯到 MyCustomColumn.dll 中,並將其複製到您想試驗的應用程式的 /bin 資料夾中。本例中,我建立一個新的 Web 應用程式 UseCustomColumn,並在我的 /bin 目錄的 MyCustomColumn.dll 中新增一個引用。在 ASPX 檔案的頂部,新增 @Register 指令:

<%@ Register TagPrefix="dgg" 
      Namespace="MyCustomColumn" 
      Assembly="MyCustomColumn" %>

請注意,新的 Datagrid 列型別不會為 Datagrid 出現在 Visual Studio .NET 屬性生成器中,因此您需要進入 HTML 檢視並在其中新增列宣告。確保 Datagrid 宣告位於一組 <form runat="server">...</form> 標記之中,這些標記用於處理 PostBack。ASPX 檔案的其餘部分應如下所示:

<%@ Page Language="vb" 
   AutoEventWireup="false" 
   Codebehind="WebForm1.aspx.vb" 
   Inherits="UseCustomColumn.WebForm1" 
Trace="False" Debug="True"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
   <HEAD>
      <title>WebForm1</title>
      <LINK rel="stylesheet" type="text/css" href="Styles.css">
      <meta name="GENERATOR" content="Microsoft Visual Studio.NET 7.0">
      <meta name="CODE_LANGUAGE" content="Visual Basic 7.0">
      <meta name="vs_defaultClientScript" content="JavaScript">
      <meta name="vs_targetSchema" 
         content="http://schemas.microsoft.com/intellisense/ie5">
   </HEAD>
   <body>
   <form id="Form1" method="post" runat="server">
   <asp:DataGrid id="DataGrid1" 
      runat="server" CssClass="grid" 
      AutoGenerateColumns="False">
      <Columns>
         <asp:EditCommandColumn 
            EditText="Edit" CancelText="Cancel" 
            UpdateText="Update" />
         <asp:BoundColumn 
            DataField="OrderID" 
            ReadOnly="True" 
            HeaderText="Order ID"/>
         <asp:BoundColumn 
            DataField="ShipName" 
            HeaderText="Ship to" 
            ReadOnly="True"/>
         <asp:BoundColumn 
            DataField="ShipCountry" 
            HeaderText="Country" 
            ReadOnly="True"/> 
         <dgg:DropDownColumn DataField="ShipVia" HeaderText="Ship Method" />
      </Columns>
   </asp:DataGrid>
   </form>
   </body>
</HTML>

Datagrid 被繫結到 Northwind 示例的 Orders 表,自定義 DropDownColumn 被繫結到 ShipVia 列。現在我只設定 DataField 屬性,因為剛剛繫結到一個簡單的 ArrayList,不需要 DataTextFieldDataValueField 屬性。如果您有預定義的常數列表或者您需要一個快速設定選項的方法,ArrayList 選項最簡單。DropDownColumnDataSource 在程式碼中設定,首先引用 DropDownColumn

Dim DDC As MyCustomColumn.DropDownColumn
DDC = CType(DataGrid1.Columns(4), MyCustomColumn.DropDownColumn)
 Dim AL As New ArrayList
 AL.Add("Shipping Company A")
 AL.Add("Shipping Company B")
 AL.Add("Shipping Company C")
 DDC.DataSource = AL

下面是執行此程式碼的結果:

圖 3:使用 ArrayList

接下來,我需要轉換該示例以便使用資料庫中的活動表。ShipVia 是查詢表 Shippers 的外來鍵,我在程式碼中將其指定為 DropDownColumnDataSource。我還需要改變 DropDownColumn 宣告,以包括與 Shippers 表中的相應欄位匹配的 DataTextFieldDataValueField 名稱:

<dgg:DropDownColumn 
   DataField="ShipVia" 
   DataTextField="CompanyName" 
   DataValueField="ShipperID" HeaderText="Ship Method" />

然後將兩個 Orders 表繫結到 Datagrid,將 Shippers 表繫結到自定義列:

     Dim SQL As String = 
     "SELECT OrderID, ShipName, ShipCountry, ShipVia FROM Orders"
        Dim DA As SqlDataAdapter = New SqlDataAdapter(SQL, ConnStr)
        Dim DS As New DataSet
        DA.Fill(DS, "Orders")
        'Dim Cmd As SqlCommand = New SqlCommand(SQL, Conn)
        'Conn.Open()
        'DataGrid1.DataSource = _
      Cmd.ExecuteReader(CommandBehavior.CloseConnection)
        DataGrid1.DataSource = DS.Tables("Orders").DefaultView
        SQL = "SELECT ShipperID, CompanyName " & _
            "FROM Shippers ORDER BY ShipperID"
        DA.SelectCommand.CommandText = SQL
        DA.Fill(DS, "Shippers")
        DDC.DataSource = DS.Tables("Shippers").DefaultView
        DataGrid1.DataBind()

DataGridColumn 使用活動資料,根據 Orders 表中的值(1、2 或 3)自動選擇正確的專案,如下所示:

圖 4:從資料庫中檢索資料

使用 DropDownColumn 的最後一步是檢索選定的值以傳遞迴資料庫更新。為此,只需在單元格內引用 DropDownList 控制元件,並確定其 SelectedValue 屬性:

 Private Sub DataGrid1_UpdateCommand( _
   ByVal source As Object, _
   ByVal e As System.Web.UI.WebControls.DataGridCommandEventArgs) _
   Handles DataGrid1.UpdateCommand
        Dim CustomDDL As DropDownList = _
CType(e.Item.Cells(4).Controls(0), DropDownList)
        Dim NewShip As Integer = CustomDDL.SelectedValue
        Dim OrderID As Integer = Int32.Parse(e.Item.Cells(1).Text)
        Dim SQL As String = _
         "UPDATE Orders SET [email protected] WHERE [email protected]"
        Dim Conn As SqlConnection = New SqlConnection(ConnStr)
        Dim Cmd As New SqlCommand(SQL, Conn)
        Cmd.Parameters.Add(New SqlParameter("@Ship", NewShip))
        Cmd.Parameters.Add(New SqlParameter("@ID", OrderID))
        Conn.Open()
        Cmd.ExecuteNonQuery()
        Conn.Close()
        DataGrid1.EditItemIndex = -1
        BindGrid()
    End Sub

小結

上文概述瞭如何以 DataGridColumn 為父型別建立一個新型別、如何進行資料繫結以及如何將其應用到實際應用程式中。這只是可重複使用的 Datagrid 列的一個示例,因此,您需要檢查您自己的應用程式,以確定哪些重複的功能可以封裝到其自己的自定義 Datagrid 列中。您可以開發自己的列,以解決常見問題(例如,在列中顯示 DropDownList),或滿足您公司的特殊需要。您也不必拘泥於本文的示例,只在自定義列中包含一個 ASP.NET 控制元件,您可以編寫更復雜的結構,例如將一系列控制元件、第三方內容或整個 Datagrid 控制元件巢狀到列中,以表現多層資訊。總之,您可以充分發揮您的想象力。

5 個內建的列型別非常有用,它們可以滿足使用 Datagrid 控制元件進行顯示的大多數情況下的需要。現在並沒有開發您自己的控制元件,只是將一些有意義的內容隨便放到 TemplateColumn 中。建立自定義列使您可以突破這些限制,在您的 Datagrid 應用程式中新增豐富的功能。

作者簡介

“Datagrid 女孩”Marcie Robillard 是 Microsoft 最優秀的 ASP.NET 專家,她是一位獨立的 ASP.NET 顧問和培訓師。ASP.NET Datagrid 是她的專業,她還專門為此建立了一個 Web 站點 DatagridGirl.com。您可以從該站點找到優秀 Datagrid 文章的連結、Datagrid 內容的書評以及不斷增加的 Datagrid 常見問題。Marcie 還花費了大量時間主持 ASP.NET 論壇,回答有關 Datagrid 的各種問題。Marcie 當前的任務是指導各公司開發自己的 .NET 技術。如果您的組織需要這方面的專業諮詢或培訓,請聯絡 [email protected]

相關推薦

ASP.NET Datagrid 建立定義

Marcie RobillardDatagridGirl.com 2003 年 9 月 簡介 不得不承認,為 Microsoft® ASP.NET 編寫 Datagrid 程式碼包括大量的重複工作。儘管我深受該控制元件的困擾,但我還是不斷尋找簡化這類任務的捷徑。誰都不願意做

ASP.NET MVC下定義錯誤頁和展示錯誤頁的幾種方式

提供服務 one url attribute 運行 16px execute 釋放 namespace 在網站運行中,錯誤是不可避免的,錯誤頁的產生也是不可缺少的。 這幾天看了博友的很多文章,自己想總結下我從中學到的和實際中配置的。 首先,需要知道產生錯誤頁的來源,一種

Asp.Net Core 通過定義中間件防止圖片盜鏈的實例(轉)

訪問 沒有 static padding task start leg 自我 header 一、原理 要實現防盜鏈,我們就必須先理解盜鏈的實現原理,提到防盜鏈的實現原理就不得不從HTTP協議說起,在HTTP協議中,有一個表頭字段叫referer,采用URL的格式來表示從哪兒

ASP.NET MVC 下定義模型繫結,去除字串型別前後的空格

直接貼程式碼了: SkyModelBinder.cs using System.ComponentModel; using System.Linq; using System.Web.Mvc; namespace MvcSample.Extensions { public cl

Asp.net 2.0定義控制元件(點選HyperLink後執行事件)[網友問題: DataList裡HyperLink控制元件激發事件,在哪定義?]

 (一). 概述         HyperLink預設沒有Click事件,  重寫了一個HyperLink自定義控制元件.         實現原理:          預設Hyperlink是跳到點選請求的頁面, 本HyperLink自定義控制元件最終也是跳轉到請求的頁面, 但期間        執行

WPF中DataGrid使用定義繫結資料

本文用一個簡單的例子進行演示,顯示一個人的姓名和年齡。其中,年齡大於30歲的以紅色顯示,年齡小於20歲的以綠色顯示。功能簡單。 1、首先確定顯示的表格有幾列資料,分別顯示為什麼形式。建模時,DataG

ASP.NET中使用定義驗證控制元件(原作)

   asp.net 1.1中,有不少驗證控制元件,大大方便了我們,但有的時候,當需要做特殊的驗證時,還會覺得不夠用的,於是我們可以用自定義驗證控制元件CustomValidator,要使用這個控制元件,必須在服務端寫相應的事件,格式如下:Sub FunctionName(s

asp.net中使用者定義控制元件呼叫另外一個使用者定義控制元件中的方法

昨天同事問我一個問題,說是在一個頁面中有二個使用者自定義控制元件,他現在想在其中一個使用者自定義控制元件中呼叫另外一個使用者自定義控制元件的一個方法。當時感覺很奇怪,為什麼要這樣呢。可是他說他要完成這樣一個功能,所以我就簡單的用一個反射的功能來完成它。試了一下,還行功能可以實

ASP.NET Core - 實現定義WebApi模型驗證

  Framework時代     在Framework時代,我們一般進行引數驗證的時候,以下程式碼是非常常見的 [HttpPost] public async Task<JsonResult> SaveNewCustomerAsnyc(AddCustom

ASP.NET Core Identity定義資料庫結構和完全使用Dapper而非EntityFramework Core

前言 原本本節內容是不存在的,出於有幾個人問到了我:我想使用ASP.NET Core Identity,但是我又不想使用預設生成的資料庫表,想自定義一套,我想要使用ASP.NE Core Identity又不想使用EntityFramework Core。真難伺候,哈哈,不過我認為這個問題提出的非常有價值,

asp.net core razor定義taghelper

又一個新的名詞(taghelper),通過taghelper是可以操作html標籤、條件輸出、更是自由新增內外元素。當然也內建了挺多的asp-開頭的taghelper。 下面文章中也簡單的帶大家實現一個taghelper; 建立自定義html元素 建立一個類ButtonTagHelper tagName為

ASP.NET Core AutoWrapper 定義響應輸出

## 前言 AutoWrapper是一個簡單可自定義全域性異常處理程式和ASP.NET Core API響應的包裝。他使用ASP.NET Core middleware攔截傳入的HTTP請求,並將最後的結果使用統一的格式來自動包裝起來.目的主要是讓我們更多的關注業務特定的程式碼要求,並讓包裝器自動處理HTT

asp.net頁面的位址中顯示定義的ICO圖示

1.瀏覽器呼叫Favicon的原則是首先在網頁所在的目錄下尋找Favicon.ico檔案,如果沒有,便到網站的根目錄下尋找。因此,在網頁中使用Favicon最簡單的辦法便是將製作好的圖示檔案命名為Favicon.ico,然後將其上傳到網站的根目錄即可。 2.如果您需要將Fa

ASP.NET MVC 中建立定義 HtmlHelper 控制元件

概述 在ASP.NET MVC框架中已經封裝了很多基於Html標準的Html控制元件,我們可以方便的使用這些控制元件輸出想要的內容,使開發變得快捷。 例如ASP.NET MVC框架包括以下設定標準的HTML控制元件(部分控制元件): Html.ActionLink()H

ASP.NET Core中建立定義端點視覺化圖

在[上篇文章中](https://www.cnblogs.com/yilezhu/p/13336066.html),我為構建自定義端點視覺化圖奠定了基礎,正如我[在第一篇文章中](https://www.cnblogs.com/yilezhu/p/13301981.html)展示的那樣。該圖顯示了端點路由的不

使用C# .net開發微信公眾號之建立定義選單

自定義選單能夠幫助公眾號豐富介面,讓使用者更好更快地理解公眾號的功能。開啟自定義選單後,公眾號介面如圖所示: 請注意: 1、自定義選單最多包括3個一級選單,每個一級選單最多包含5個二級選單。 2、一級選單最多4個漢字,二級選單最多7個漢字,多出來的部分將會以“...”代替。 3、建立自定義選單後,選單

Linux/macOS 程式建立定義程序名的程序 [以 python 例]

在系統中可能會多次使用 python 執行 py 檔案,或在終端直接執行 python 命令列,因此可能會建立多個 PID 不同,但程序名都為 python 的程序。而通過 ps 命令就會獲取多個程

SharePoint 2010--WebPart建立定義屬性

通過為web part建立自定義屬性,我們可以通過改變web part的屬性實現web part在頁面上的動態顯示。這些屬性儲存在資料庫中,可以在頁面載入的時候進行重用。 接下來建立的web part將會顯示Address,web part提供自定義屬性可以供SharePo

ThinkPHP建立定義命令

第一步,配置command.php檔案,目錄在application/command.php <?php return [ 'app\home\command\Test', ]; 第二步,建立命令類檔案,新建application/ho

使用.Net Core CLI命令dotnet new建立定義模板

文章起源來自一篇部落格:使用 .NET CORE 建立 專案模板,模板專案,Template - DeepThought - 部落格園 之前使用Abp的時候就很認同Abp建立模板專案的方式。想不到.Net Core出了更讚的方式建立模板。之前寫過一個系列文章,有不少對Abp框架的改動(見文章:基於.NetCo