2012-02-28 57 views
1

我是新来的asp.net,最近一直在从代码隐藏创建一个GridView,使它更加灵活,以便我最终可以根据用户规范创建它。如何从类创建一个GridView

现在我正在探索类,我认为创建一个GridView类是很酷的,所以无论何时我需要创建一个GridView,我都可以通过类的规范而不是重写相同的代码每个页面的代码隐藏。

我并没有看到太多的例子来说明如何完成这个。你有没有做过这个?这对我来说甚至是合理的吗?

这是我目前如何使我的GridView与代码隐藏。任何想法如何改变这个创建一个类的GridView?

.aspx页面中:

<asp:GridView ID="GridView1" runat="server" AllowSorting="True" AutoGenerateColumns="False" 
EmptyDataText="There are no data records to display." AllowPaging="True" 
CssClass="GridViewStyle" GridLines="None" Width="100%"> 
    <Columns>      
     <asp:HyperLinkField DataNavigateUrlFields="EmployeeID" 
      DataNavigateUrlFormatString="EmployeeProfile.aspx?EmployeeID={0}" 
      DataTextField="EmployeeID" 
      DataTextFormatString= "<img src='Images/icons/document-search-result.png' alt='View'/> <u>View</u>" > 
      <ControlStyle CssClass="titleLinksB" /> 
      <ItemStyle Wrap="False" /> 
     </asp:HyperLinkField>       
    </Columns> 
    <RowStyle CssClass="RowStyle" /> 
    <EmptyDataRowStyle CssClass="EmptyRowStyle" /> 
    <PagerSettings Mode="NumericFirstLast" PageButtonCount="5" /> 
    <PagerStyle CssClass="PagerStyle" /> 
    <SelectedRowStyle CssClass="SelectedRowStyle" /> 
    <HeaderStyle CssClass="HeaderStyle" /> 
    <EditRowStyle CssClass="EditRowStyle" /> 
    <AlternatingRowStyle CssClass="AltRowStyle" /> 
    <SortedAscendingHeaderStyle CssClass="sortasc"></SortedAscendingHeaderStyle> 
    <SortedDescendingHeaderStyle CssClass="sortdesc"></SortedDescendingHeaderStyle>   
</asp:GridView> 

.aspx.vb代码隐藏页:

Partial Class GridTest2 
Inherits System.Web.UI.Page 

Sub Page_load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load 
    If Not Page.IsPostBack Then 
     CreateGridColumns() 
     BindGrid() 
    End If 
End Sub 

Public Property SortExpression As String 
    Get 
     If ViewState("SortExpression") Is Nothing Then 
      ViewState("SortExpression") = "LastName ASC" 
     End If 
     Return ViewState("SortExpression").ToString 
    End Get 
    Set(ByVal value As String) 
     ViewState("SortExpression") = value 
    End Set 
End Property 

Private Sub CreateGridColumns() 
    Dim curLastName As New BoundField 
    curLastName.HeaderText = "Last Name" 
    curLastName.DataField = "LastName" 
    curLastName.SortExpression = "LastName" 

    GridView1.Columns.Insert(0, curLastName) 


    Dim curFirstName As New BoundField 
    curFirstName.HeaderText = "First Name" 
    curFirstName.DataField = "FirstName" 
    curFirstName.SortExpression = "FirstName" 

    GridView1.Columns.Insert(1, curFirstName) 

End Sub 

Private Sub BindGrid() 
    Try 
     Dim tblData = New DataTable 
     Using sqlCon As New SqlClient.SqlConnection(ConfigurationManager.ConnectionStrings("dbConnectionString").ConnectionString.ToString()) 
      Dim sql As String = "SELECT * FROM Employees" 
      Dim sqlCmd = New SqlClient.SqlCommand() 
      sqlCmd.CommandText = String.Format(sql, Me.SortExpression) 
      sqlCmd.Connection = sqlCon 
      Using objAdapter As New SqlClient.SqlDataAdapter(sqlCmd) 
       objAdapter.Fill(tblData) 
      End Using 
     End Using 
     GridView1.DataSource = tblData 
     GridView1.DataBind() 
     GridView1.HeaderRow.CssClass = "HeaderStyle" 

    Catch ex As Exception 
     ' TODO: log error ' 
     Throw 
    End Try 
End Sub 
Private Sub GridView1_PageIndexChanging(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewPageEventArgs) Handles GridView1.PageIndexChanging 
    Me.GridView1.PageIndex = e.NewPageIndex 
    BindGrid() 
End Sub 
Protected Sub GridView1_RowDataBound1(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridView1.RowDataBound 
    'Protected Sub GridView1_RowDataBound(ByVal sender As Object, ByVal e As GridViewRowEventArgs) 
    Dim gridView As GridView = DirectCast(sender, GridView) 
    Dim sortColumn As String, sortDirection As String 
    sortColumn = Me.SortExpression.Split(" "c)(0) 
    sortDirection = Me.SortExpression.Split(" "c)(1) 

    If e.Row.RowType = DataControlRowType.Header Then 
     Dim cellIndex As Integer = -1 
     For Each field As DataControlField In gridView.Columns 
      If field.SortExpression = sortColumn Then 
       cellIndex = gridView.Columns.IndexOf(field) 
      End If 
     Next 

     If cellIndex > -1 Then 
      ' this is a header row, set the sort style 
      e.Row.Cells(cellIndex).CssClass = If(sortDirection = "ASC", "sortasc", "sortdesc") 
     End If 
    End If 

End Sub 




Private Sub GridView1_Sorting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewSortEventArgs) Handles GridView1.Sorting 
    Dim currentSortColumn, currentSortDirection As String 
    currentSortColumn = Me.SortExpression.Split(" "c)(0) 
    currentSortDirection = Me.SortExpression.Split(" "c)(1) 
    If e.SortExpression.Equals(currentSortColumn) Then 
     ' switch sort direction ' 
     Select Case currentSortDirection.ToUpper 
      Case "ASC" 
       Me.SortExpression = currentSortColumn & " DESC" 
      Case "DESC" 
       Me.SortExpression = currentSortColumn & " ASC" 
     End Select 
    Else 
     Me.SortExpression = e.SortExpression & " ASC" 
    End If 
    BindGrid() 

End Sub 


End Class 

任何帮助,不胜感激!

回答

0

如果我理解正确,您正在尝试使自定义Gridview类。你可以按照下面的链接寻求你的帮助。你所需要做的就是创建一个继承Gridview类的类,以便覆盖默认的功能以使其更通用。

Extending the GridView Control

Custom Gridview with paging and filtering

Creating Custom Gridview Control

+0

这个信息应该有所帮助。谢谢。 – Cineno28 2012-02-28 18:16:21

+0

其实我在这里还是有点困惑。我想要做的是创建一个我可以使用的外部类,以便当我想在任何页面上创建GridView时,我可以使用该类,而不是在每个页面的代码隐藏中手动创建它。我提供的代码用于从代码隐藏中创建GridView。我只是想弄清楚如何重写它,以便它可以从类创建。 – Cineno28 2012-02-28 20:14:57

+0

对你来说很老实,我一年前在MSDN上亲自问过这个问题,MSFT家伙说这是一项非常大的工作。 Gridview的扩展并不容易。我提供的是一个好的开始,但从那里你就是我的朋友。:)祝你好运 – 2012-02-29 16:38:46