Хороший способ добавить контекстную справку в существующее приложение Windows Forms?

Я должен добавить подсказки на основе базы данных в существующее приложение WinForms, большое. C# и.NET 3.5

Я бы хотел избежать для этого новых элементов управления, и пользователь должен иметь возможность редактировать всплывающие подсказки.

Мое лучшее предположение - обернуть существующие элементы управления в новый тип, содержащий новые свойства, чтобы я мог назначить новое свойство, например "FieldHelpName", и использовать его в административном модуле, чтобы пользователь мог четко идентифицировать поле. Я бы назначил ScreenID для каждой формы, и каждая запись FieldHelpName будет связана с ScreenID. При запуске приложения загрузите все содержимое справки, а при загрузке формы отфильтруйте его по ScreenID и, скорее всего, добавьте соответствующие всплывающие подсказки, используя отражение.

Я ищу предложения о том, как сделать этот процесс лучше всего, или узнать, есть ли какие-либо передовые методы, как это сделать... поэтому любая помощь действительно ценится. Благодарю.

2 ответа

Решение

Закончилось создание таблицы базы данных для конфигурации и указание имени элемента управления для каждой строки, а затем рекурсивное зацикливание экранных элементов управления для добавления всплывающих подсказок, если текущее имя элемента управления соответствует имени элемента управления записи базы данных.

Зачем идти на такие длины?

Вы можете сделать то же самое с помощью чего-то более простого:

Private _ToolTipList As New List(Of ToolTip)

<Extension()> _
Public Function CreateForm(ByVal formType As Type) As Form
  If (formType Is Nothing) Then
    Throw New ArgumentNullException("formType")
  End If
  If (Not GetType(Form).IsAssignableFrom(formType)) Then
    Throw New InvalidOperationException _
        (String.Format("The type '{0}' is not a form.", formType.FullName))
  End If

  Dim ctor = formType.GetConstructor(New Type() {})
  If (ctor Is Nothing) Then
    Throw New InvalidOperationException _
        (String.Format _
            ("The type '{0}' does not have a public default constructor.", _
            formType.FullName))
  End If

  Dim frm As Form = ctor.Invoke(New Object() {})
  Dim toolTip As New ToolTip(New Container())
  LoadToolTipData(toolTip, frm)
  _ToolTipList.Add(toolTip)

  Return frm

End Function

Private Sub LoadToolTipData(ByVal toolTip As ToolTip, _
                            ByVal ctrl As Control, _
                   Optional ByVal parentHierarchy As String = "")

  Dim currentHierarchy = parentHierarchy & "." & ctrl.Name
  Dim toolTipText = LoadDataFromDb(currentHierarchy)
  If Not String.IsNullOrEmpty(toolTipText) Then
    toolTip.SetToolTip(ctrl, toolTipText)
  End If

  For Each c As Control In ctrl.Controls
    LoadToolTipData(toolTip, c, currentHierarchy)
  Next

End Sub

Private Function LoadDataFromDb(ByVal key As String) As String
  Return String.Empty
End Function
Другие вопросы по тегам