2012-06-01 44 views
3

我正在處理自定義GridView控件,需要一些幫助。如果手動輸入列名,我可以正確地吐出我需要的東西。現在我有兩個問題。第一個是讓列標題動態顯示。第二種是動態填充行項目。ASP.net自定義GridView控件

Default.aspx的

<asp:View id="vCreateNew" runat="server"> 
      Content Here (View 2)... 
      <trac:DataGridView id="gvMain" runat="server" GridLines="Horizontal" AutoGenerateColumns="False" > </trac:DataGridView> 
     </asp:View> 

Default.aspx.vb

Partial Class processes_ProgramTrack_Default 
    Inherits Citi.CSPaper.Controls.BasePage 
    Protected Sub ProgramTrackNav_MenuItemClick(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.MenuEventArgs) Handles ProgramTrackNav.MenuItemClick 
     Dim strSelection As String = ProgramTrackNav.SelectedValue 
     Dim sqlDataSource As New SqlDataSource() 
     sqlDataSource.ConnectionString = ConfigurationManager.ConnectionStrings("CSPaperWEBConnectionString").ConnectionString 
     Select Case strSelection 
      ......     
      Case "CreateNew" 
       mlvNav.SetActiveView(vCreateNew) 
       sqlDataSource.SelectCommand = "SELECT [ProgramNumber], [ProgramName], [ProgramStatus] FROM tblPrgTrackPrograms" 
       Dim args As New DataSourceSelectArguments 
       gvMain.DataSource = sqlDataSource.Select(args) 
       gvMain.DataBind() 
      ........ 
      End Select 
    End Sub 
End Class 

GridViewControl.ascx

<%@ Control Language="VB" AutoEventWireup="false" CodeFile="GridViewControl.ascx.vb" Inherits="GridViewControl" %> 
<asp:GridView ID="GridViewControl" runat="server" > 
</asp:GridView> 

GridViewControl.ascx.vb

Public Class GridViewControl 
    Inherits System.Web.UI.UserControl 
    Private _html As New StringBuilder() 
    Private _dataSource As IEnumerable 
    Private _CssClass As String 
    Private _CellSpacing As String 
    Public Property DataSource() As IEnumerable 
     Get 
      Return _dataSource 
     End Get 
     Set(ByVal value As IEnumerable) 
      _dataSource = value 
     End Set 
    End Property 
    Public Overridable Property CssClass() As String 
     Get 
      Return _CssClass 
     End Get 
     Set(ByVal value As String) 
      _CssClass = value 
     End Set 
    End Property 
    Public Overridable Property CellSpacing() As String 
     Get 
      Return _CellSpacing 
     End Get 
     Set(ByVal value As String) 
      _CellSpacing = value 
     End Set 
    End Property 
    Private Sub CreateBulletedList() 
     Dim dataSource As IEnumerable = Nothing 
     Dim i As Integer = 0 
     Dim strArr() As String = {"ID", "Name", "Fee"} 
     Try 
      dataSource = Me._dataSource 
     Catch 
     End Try 

     If Not (dataSource Is Nothing) Then 
      _html.Append("<table id=""" & ClientID & """ class=""" & _CssClass & """ CellSpacing=""" & _CellSpacing & """>") 
      _html.Append("<thead>" & vbCrLf & "<tr>" & vbCrLf) 
      For Each Item As String In strArr 
       _html.Append("<th>" & Item & "</th>" & vbCrLf) 
      Next 
      _html.Append("</tr>" & vbCrLf & "</thead><tbody>" & vbCrLf) 
      For Each dataObject As Object In dataSource 
       _html.Append("<tr>" & vbCrLf) 
       For i = 0 To 2 
        _html.Append("<td>" & vbCrLf) 
        _html.Append(dataObject.Row(i)) 
        _html.Append("</td>" & vbCrLf) 
       Next 
       _html.Append("</tr>" & vbCrLf) 
      Next dataObject 
      _html.Append("</tbody></table>" & vbCrLf) 
     End If 
    End Sub 
    Public Overrides Sub DataBind() 
     MyBase.OnDataBinding(EventArgs.Empty) 

     CreateBulletedList() 
    End Sub 
    Protected Overrides Sub Render(ByVal output As HtmlTextWriter) 
     output.Write(_html) 
    End Sub 
End Class 

------------------------------------ 
| Table Data      | 
------------------------------------ 
ID AppName   Environment 
2 TestApp   UAT 
3 ServerFileMaint UAT 
4 ProgramTrack  Development 
5 RegZ_Stmnt_Adj  Active 
6 SecInv    Decommission 

我不想手動編碼for i = 0 to ...,上限,但要動態地做到這一點。標題的方式相同。我碰到的問題是,如果我沒有硬編碼upperbound,我得到一個錯誤消息,說明Cannot find column 3.。當編寫第二個For Each塊時,我會得到這個循環來遍歷包含數據的行。

+0

你有沒有機會嘗試我的代碼?或者你有替代路線嗎? – Peter

+0

我採取了替代路線。 – atrueresistance

回答

0

我想我理解這裏發生了什麼,以及如何解決它。

我混亂的最大來源是塊:

  For Each dataObject As Object In dataSource 
       _html.Append("<tr>" & vbCrLf) 
       For i = 0 To 2 
        _html.Append("<td>" & vbCrLf) 
        _html.Append(dataObject.Row(i)) 
        _html.Append("</td>" & vbCrLf) 
       Next 
       _html.Append("</tr>" & vbCrLf) 
      Next dataObject 

如果數據源是一個DataSet那麼這種有道理......但不是真的,因爲不是你想引用表(0) 。如果dataSource是一個DataTable,那麼這種情況是有道理的,除非不是真的,因爲那樣你會想要循環通過For Each dataObject as DataRow in dataSource.Rows。這似乎並不是因爲你引用了dataObject.Row(i)。

你probalby想要做的是(粗糙/未經測試的代碼)更是這樣的:

  For Each dataObject As DataRow In dataSource.Rows 
       _html.Append("<tr>" & vbCrLf) 
       For Each col as DataColumn In dataSource.Columns 
        _html.Append("<td>" & vbCrLf) 
        _html.Append(dataObject(col).ToString()) 
        _html.Append("</td>" & vbCrLf) 
       Next 
       _html.Append("</tr>" & vbCrLf) 
      Next 

這使得假設數據源是一個DataTable,你通過所有表中的行會循環,然後對於每一行,您將循環訪問數據表中的所有列,並獲取該行中每列的數據並顯示它。