【发布时间】:2009-05-07 04:44:03
【问题描述】:
抱歉,这是我能想到的最好的主题,如果我能更好地理解解决方案,我可能会写出更好的主题行。
我正在使用一个很棒的网格控件,超级列表,我位于这里:
在阅读问题之前,请注意您可以下载一个非常小的 VB.NET 2005 示例应用程序来演示该问题:
http://dokmanovich.com/Documents/SuperListEvents.zip
我希望,得到我的问题的答案将有助于我更好地理解我正在努力完成的事情背景下的动态事件。
网格的工作原理是这样的:当您向网格添加列时,您指定一个事件处理程序的地址,该处理程序将在运行时返回值。在这种情况下,CC_ItemValueAccessor 函数。后一个函数将使用输入参数调用,在这种情况下,输入参数是“ToDo”对象。每个 ToDo 对象将在网格中呈现为一行。 CC_ItemValueAccessor 函数的作用是为传入的 ToDo 对象对应的行返回要由网格显示的列值。
这很好,直到我将其带到下一步:
我想动态地在运行时创建列。例如,我想显示作为执行用户指定 SQL 的结果返回的数据表的输出。
使用前面描述的静态方法,我有一个 columnItemValueAccessor 函数,负责为传入的行对象返回网格中每一列的值。现在,由于列是在运行时根据 SQL 返回的结果确定的,我相信我需要编写一个通用处理程序来处理所有列,确定触发此事件的列的名称,然后返回该列的值作为唯一参数传入的行对象。
问题是 ItemValueAccessor 函数的签名仅包含行对象,我不知道如何确定需要哪个列名,因为所有列都与事件相同的 ItemValueAccessor 函数处理程序。
我怀疑这只是控件的一个限制,为了克服这个问题,我必须增强底层的自定义控件,但这可能超出了我目前的技能,因为它是用 C# 编写的高级控件,我是一个VB的家伙。
代码如下:
Private Sub AddCcColumn()
Dim NewColumn As New BinaryComponents.SuperList.Column("CC", "CC", 110, AddressOf Cc_ItemValueAccessor)
_SuperList.Columns.Add(NewColumn)
End Sub
Private Function Cc_ItemValueAccessor(ByVal rowItem As Object) As Object
Dim ToDo As ToDo = CType(rowItem, SrToDoAndException).ToDo
Return ToDo.CCs.ToString
End Function
'---------------
这里是 Column 的实例化方法的签名和最后一个参数的定义,该参数负责指定处理标识负责返回列值的事件处理程序的过程。
Public Sub New(ByVal name As String, ByVal caption As String, ByVal width As Integer, ByVal columnItemValueAccessor As BinaryComponents.SuperList.ColumnItemValueAccessor) BinaryComponents.SuperList.Column 的成员
Public Sub New(ByVal object As Object, ByVal method As System.IntPtr) BinaryComponents.SuperList.ColumnItemValueAccessor 的成员
有没有人有任何建议或者我被困住了?我真的很想利用这个控件的神奇分组功能,这样我就可以显示动态输出,允许用户按他们想要的任何列对 SQL 的动态输出进行分组。
我在上述网站上向作者提出了这个问题,但没有得到答复。这是一次绝望的尝试,想找到一种方法来做到这一点。
感谢您对我的包容。我希望这个问题不会因为我提到第三方控制而被拒绝。我希望答案在于更好地理解代表,这是一个更普遍的话题。
【问题讨论】:
-
Lamba 评论很有趣,但我需要更多帮助。我创建了一个工作示例,将问题简化为基本问题,并添加了一条说明需要什么的注释。如果你愿意的话,你可以在这里得到它:dokmanovich.com/Documents/SuperListEvents.zip 否则,我只是在寻找比伪代码更好的东西和一个大方向的点,因为我自己似乎无法弄清楚。我提供赏金,从 50 开始。