Как программно связать данные <% # Eval ("Object.Property")%> в VB.NET - PullRequest
0 голосов
/ 07 января 2011

Я могу привязать свойство внутреннего объекта к gridview, используя следующую настройку во время разработки в ASP.NET gridview

<asp:TemplateField HeaderText="ObjectName" >
                            <ItemTemplate>                                        
                                            <%# Eval("Object.property")%>                                       
                                    </ItemTemplate>
                        </asp:TemplateField>

, но я хотел бы знать, создать это программно во время выполнения

т.е. определите мои столбцы, добавьте их в сетку и затем привязайте данные

Ответы [ 2 ]

2 голосов
/ 07 января 2011

Я не уверен, что это то, чего вы хотите достичь.Но если вы хотите динамически создавать столбцы в соответствии со свойствами вашего объекта во время выполнения, взгляните на следующий код (пример с BoundColumns, посмотрите на ответ Volpa, когда вам нужны TemplateColumns):

ASPX:

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false"></asp:GridView>

Код позади:

Public Partial Class GridViewTest
    Inherits System.Web.UI.Page

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        If Not IsPostBack Then
            BindData()
        End If
    End Sub

    Private Sub BindData()
        Dim cList As New List(Of CustomClass)
        For i As Int32 = 1 To 10
            Dim c As New CustomClass
            c.ID = i
            c.Name = "Object " & i
            cList.Add(c)
        Next
        Dim model As New CustomClass
        For Each prop As Reflection.PropertyInfo In model.GetType.GetProperties
            If prop.CanRead Then
                Dim field As New BoundField()
                field.HeaderText = prop.Name
                field.DataField = prop.Name
                Me.GridView1.Columns.Add(field)
            End If
        Next
        Me.GridView1.DataSource = cList
        Me.GridView1.DataBind()
    End Sub

End Class

Public Class CustomClass
    Private _id As Int32
    Private _name As String

    Public Property ID() As Int32
        Get
            Return _id
        End Get
        Set(ByVal value As Int32)
            _id = value
        End Set
    End Property

    Public Property Name() As String
        Get
            Return _name
        End Get
        Set(ByVal value As String)
            _name = value
        End Set
    End Property
End Class
1 голос
/ 07 января 2011

Один из способов - создать класс, который реализует интерфейс ITemplate :

public class PropertyTemplate : ITemplate
{
    private string _value = string.Empty;

    public PropertyTemplate(string propValue) 
    { 
        this._value = propValue;
    }

    public void InstantiateIn(Control container)
    {
        container.Controls.Add(new LiteralControl(this._value));
    }
}

Затем в вашем коде выделите ItemTemplate следующим образом:

myTemplateField.ItemTemplate = new PropertyTemplate(myBusinessObject.MyProperty);

Другой способ - использовать Page.LoadTemplate , если ваш пользовательский шаблон находится в отдельном файле .ascx:

myTemplateField.ItemTemplate = Page.LoadTemplate("~/MyTemplate.ascx");

И файл .ascx будет выглядеть:

<%# Eval("MyProperty") %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...