2012-06-01 4 views
3

사용자 지정 GridView 컨트롤에서 작업 중이므로 도움이 필요합니다. 필자가 수동으로 열 이름을 입력하면 필요한 정보를 적절히 추출 할 수 있습니다. 지금 나는 2 가지 문제가있다. 첫 번째 방법은 열 헤더를 동적으로 표시하는 것입니다. 두 번째는 동적으로 행 항목을 채 웁니다.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

나는 여기서 무슨 일이 일어나고 있는지, 어떻게 고쳐야하는지 이해한다고 생각합니다.

나를 위해 혼란의 가장 큰 소스는이 블록 :은 dataSource는 데이터 집합은 다음의 말이 이런 종류입니다 ...하지만 정말 대신 때문에 표를 참조 할 것하지 않으면

  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 

(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 

이것은은 dataSource는 DataTable에 있다는 가정을 만들고, 해당 테이블의 모든 행을 통해 루프로 가고있다 그런 다음 각 행에 대해 데이터 테이블의 모든 열을 반복하고 각 열의 해당 행에있는 데이터를 가져 와서 표시합니다.

관련 문제