Извините, это лучший вопрос, который я могу придумать, если бы я лучше понял решение, я мог бы, вероятно, сформулировать лучшую тему.
Я использую отличный элемент управления сеткой, Super List, l расположен здесь:
http://www.codeproject.com/KB/list/outlooklistcontrol.aspx?fid=449232&df=90&mpp=25&noise=3&sort=Position&view=Quick&fr=276
Прежде чем вы прочитаете проблему, обратите внимание, что вы можете загрузить очень маленькое приложение 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
---------------------------
А вот сигнатуры метода-экземпляра столбца и определение последнего параметра, который отвечает за указание процедуры, которая обрабатывает, идентифицирует обработчик события, отвечающий за возврат значения столбца.
Public Sub New (имя ByVal как строка, заголовок ByVal как строка, ширина ByVal как целое число, ByVal columnItemValueAccessor как BinaryComponents.SuperList.ColumnItemValueAccessor)
Член BinaryComponents.SuperList.Column
Public Sub New (объект ByVal как объект, метод ByVal как System.IntPtr)
Член BinaryComponents.SuperList.ColumnItemValueAccessor
У кого-нибудь есть предложения или я застрял? Мне бы очень хотелось использовать возможности этого элемента управления для фантастической группировки, чтобы я мог отображать динамический вывод, который позволяет пользователю группировать динамический вывод SQL по любому столбцу, который он хочет.
Я адресовал вопрос автору на вышеуказанном сайте, но он остался без ответа. Это отчаянная попытка найти способ сделать это.
Спасибо за терпение со мной. Я надеюсь, что этот вопрос не будет отклонен на основании того, что я имею в виду контроль третьей стороны. Я надеюсь, что ответ заключается в лучшем понимании делегатов, в более универсальной теме.