gpt4 book ai didi

ASP.net 自定义 GridView 控件

转载 作者:行者123 更新时间:2023-12-02 14:13:34 25 4
gpt4 key购买 nike

我正在开发自定义 GridView 控件,需要一些帮助。如果我手动输入列名称,我可以让它正确地输出我需要的内容。现在我有两个问题。第一个是动态显示列标题。第二个是动态填充行项目。

默认.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>

默认.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 ...(上限),但希望动态执行此操作。标题也是如此。我遇到的问题是,如果我不对上限进行硬编码,我会收到一条错误消息,指出无法找到第 3 列。。我在编写第二个 For Each block 以循环包含数据的行时得到此信息。

最佳答案

我想我明白这里发生了什么,以及如何解决它。

对我来说最大的困惑是这个 block :

            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

如果 dataSource 是一个 DataSet,那么这种方式是有意义的...但实际上并不是这样,因为相反,您想要引用 Table(0)。如果 dataSource 是一个 DataTable,那么这种方式是有意义的,但实际上并非如此,因为那时您会希望将 For Each dataObject 作为 dataSource.Rows 中的 DataRow 进行循环。但情况似乎并非如此,因为您引用了 dataObject.Row(i)。

您可能想做的是(在粗略/未经测试的代码中)更像是这样的:

            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

这假设数据源是一个数据表,您将循环遍历该表的所有行,然后对于每一行,您将循环遍历数据表中的所有列,并获取该行中每一列的数据,显示它。

关于ASP.net 自定义 GridView 控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10856991/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com