【问题标题】:Telerik RAD Controls, how to set a List(Of GridViewRowInfo) as a RadGridView DataSource?Telerik RAD 控件,如何将 List(Of GridViewRowInfo) 设置为 RadGridView 数据源?
【发布时间】:2014-10-17 16:18:44
【问题描述】:

我正在为此寻找 C# 或 VB.NET 解决方案。


更新:

我有一个 RadGridView,其中包含 5 个手动定义的列:

AutoGenerateColumns 属性设置为False

当我实例化 GridViewRowInfo 类时,我可以为这个对象设置很多属性:

Dim MyRow As New GridViewRowInfo(Me.RadGridView1.MasterView)
With MyRow
    .Cells(0).Value = "My Value for Column 1"
    .Cells(1).Value = "My Value for Column 2"
    .Cells(2).Value = "My Value for Column 3"
    .Cells(3).Value = "My Value for Column 4"
    .Cells(4).Value = "My Value for Column 5"
    .Height = 50
    .Tag = New Object
    .IsSelected = True
End With

当我添加该行时,我之前为该行设置的属性立即生效:

RadGridView1.Rows.Add(MyRow)

如果我想添加这些行的集合,我可以设置一个新的 GridViewRowInfo 集合,实现 IList 接口:

Dim MyRows As New List(Of GridViewRowInfo)
MyRows.Add(MyRow1)
MyRows.Add(MyRow2)
MyRows.Add(MyRow3)

RadGridView1.Rows.AddRange(MyRows.ToArray)

好吧,所以我的意图是将这些行的集合设置为DataSource,例如:

RadGridView1.DataSource = MyRows

所以首先要注意的是我设置了一个GridViewRowInfo 的集合,并且我为每个GridViewRowInfo 设置了不同的属性,这些属性在添加数据源集合时应该生效,第二件事是如果我更新数据源集合以删除或添加更多行,然后RadGridView 控件应该自动执行更新而无需更多干预......不是吗?

问题是这些事情都会发生:

如您在上图中所见,当我将List(of GridViewRowInfo) 设置为我的DataSource 时,它只会添加空行,如果我之前设置了Height 属性之一的@987654341 @里面设置Datasource时不生效:

我想以更直接的方式和不那么奢侈的方式执行此操作,我的意思是我不是在寻找创建一个自定义类来将该类设置为DataSource,并复制所有属性在我的自定义类中公开GridViewRowInfo 类或一些非常棘手的东西,因为如果RadGridView 公开了一个很好的GridViewRowInfo 类以及我需要的所有东西,为什么我应该考虑创建一个自定义类来将其设置为我的@987654347 @?。

如果我对这些概念没有一个好主意或误解,请澄清一下,我知道不应该以这种方式使用数据源(或者我认为是这样),但我真的很想这样做是为了进一步简化事情,直接使用数据源(和每个行属性)而不是控件本身。


我还尝试了this link 中的官方示例(但只使用了list(Of String)),但它只是在我的网格视图中添加了一个名为“长度”的新列(带有数字数据)在该列单元格中.

【问题讨论】:

  • 您是手动设置 RadGridView 的列还是让它自动生成?
  • @har07 我手动设置了 4 列,抱歉我的无知,但我不知道为什么会这样,我想设置一个 List(of 'CompatibleRowForMyGrid') 就像上面的例子一样然后用这 4 个单元格来填充我的列中的数据,我不想生成新列,我等待您的帮助,感谢您的评论!
  • 它通常的工作方式是控件完成了您试图通过该数据源强加给它们的大部分工作 - 将类简化为 4 个简单属性并省去 Cells 杂乱无章的内容。如果 AutoGenerate 为 True,那么它将为它找到的每个属性创建列(参见示例链接,其中列是 MyIntMyString,它们是道具名称)。如果您希望 DS 填充您添加的现有列,则需要使用 DisplayMemberValueMember(可能还有 FieldName)将列映射到属性。
  • Simplify the class to 4 simple properties and leave off the Cells cruft. 什么类?我的意图不是创建自定义类,而是使用 GridViewRowInfo 类。 | If AutoGenerate is True then it will create columns for each property it finds 阅读后我将AutoGenerateColumns 设置为 False(但现在它添加了空行)。
  • If you want your DS to populate existing columns you added, you need to map Columns to Properties using the DisplayMember and ValueMember (and maybe FieldName) 他们是...的成员?我在 RadGridView 控件或 GridViewRowInfo 类上看不到这些属性,反正一旦发现我不知道如何设置它们(看到这可能有点困难)。谢谢你的评论!

标签: c# .net vb.net telerik telerik-grid


【解决方案1】:

RadGridView 支持两种填充数据的方式:

因此,您不能将网格绑定到 GridViewRowInfos 集合(因为您只会看到 GridViewRowInfo 类型属性)。您应该像现在一样继续手动添加,或者您可以使用您的数据填充 DataTable 并将其设置为网格的 DataSource。

*所有链接和信息均来自 Telerik UI for WinForms 文档

【讨论】:

    【解决方案2】:

    If I don't have a good idea or a missunderstanding of these concepts please clarify them

    您将显示的内容与显示的方式混淆了,这是两个截然不同的东西。来自他们的在线指南:The RadGridView supports the standard Windows Forms data binding model,也就是说数据源为控件提供数据,而不是演示信息。

    Public Class MyObject
       Public Property MyInt() As Integer
       Public Property MyString() As String
    ...
    
    Dim myList As New List(Of MyObject)()
    myList.Add(New MyObject(1, "Outdoor"))
    myList.Add(New MyObject(2, "Hardware"))
    myList.Add(New MyObject(3, "Tools"))
    myList.Add(New MyObject(4, "Books"))
    myList.Add(New MyObject(5, "Appliances"))
    RadGridView1.DataSource = myList
    

    结果:

    请注意控件如何自动从自定义类中获取属性名称:MyIntMyString 成为列名称。这是网格从 DataSource 中获取的唯一与布局 (HOW) 相关的内容,并且仅当 AutoGenerateColumns 为 True 时(否则它们将为空白)。当为 False 时,您可以通过对列进行布局来控制它。

    现在看看你正在尝试什么:

    With MyRow
        .Cells(0).Value = "My Value for Column 1"
        .Cells(1).Value = "My Value for Column 2"
         ...
        .Height = 50
        .Tag = New Object
        .IsSelected = True
    

    作为数据源有很多问题。主要是,您不是为单元格提供数据,而是为单元格提供单元格中的数据。您的方法有点混合了未绑定的方法(明确指定要进入每个单元格的内容)与数据源的绑定。

    但是,它怎么知道Value 是一个数据显示项呢?它应该如何知道钻入单元集合以找到Value?它怎么知道Value 是数据但Tag 不是?它应该如何知道来尝试将Height 显示为列数据?仅仅因为名称与控件的属性名称匹配?

    如果 myObject 偶然有一个与我的班级相关的 Height 属性会发生什么? 希望控件将其解释为控件布局信息,但世界其他地方可能希望将患者的身高、建筑物高度或地理形成高度显示为数据。我们必须设计具有在控件中找不到的唯一名称的类,以便让我们的数据显示并防止控件表示根据数据源中的 data 和属性名称进行异想天开的变化。

    顾名思义,GridviewRowInfo 提供行信息,而不是行数据。您的列表中存在大量演示文稿信息,但它并不能像您想要的那样工作,因为控件不使用数据源来获取演示文稿信息。


    该控件确实包括Four ways to customize RadGridView appearance:主题、UI 编辑器、事件和条件格式。

    还有其他元素,例如 GridTableElementGridTableBodyElement。实际上,这些元素包含一些控制网格单元格和行的行为和外观的属性,例如GridTableElement.RowHeightRowSpacing 等。

    tl;博士

    在 DataSource 中传递的数据不会影响呈现(除了带有 AutoGenerateColumns 的列名,但这是该属性的函数,而不是数据源。)

    【讨论】:

    • 谢谢你的详细说明!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-26
    • 2011-06-28
    • 1970-01-01
    • 2013-07-29
    • 1970-01-01
    相关资源
    最近更新 更多