Как получить конкретный BindingSource из формы Windows? - PullRequest
1 голос
/ 23 февраля 2010

Я работаю над приложением форм обслуживания окон с интерфейсом с вкладками. В форме есть 3 источника привязки (назовем это BindingSource1, BindingSource2, BindingSource3). Я пытаюсь оптимизировать код и хочу получить динамический доступ к BindingSource примерно так:

objBindingSource = Ctype (Me.Controls ("BindingSource" + SelectedBindingSourceID), BindingSource)

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

Любые идеи о том, как этого добиться, были бы великолепны.

Спасибо

Радж

Ответы [ 2 ]

3 голосов
/ 24 февраля 2010

A BindingSource является Component, а не Control, поэтому его нет в коллекции Controls. Однако дизайнер создает личное поле IContainer с именем components для хранения всех компонентов, созданных в форме, поэтому вы можете получить доступ к компонентам через это поле:

For Each c In components.Components
    MessageBox.Show(c.ToString())
Next

К сожалению, компоненты не имеют имени, поэтому вам придется найти другой способ идентифицировать ваш BindingSource ... Например, если вы знаете, что каждый BindingSource связан с DataTable, можете проверить название таблицы.

Private Function GetBindingSource(ByVal tableName As String) As BindingSource

    For Each c In components.Components

        Dim bs As BindingSource = TryCast(c, BindingSource)
        ' If the component is a BindingSource
        If bs IsNot Nothing Then

            Dim dt As DataTable = TryCast(bs.DataSource, DataTable)
            ' If the DataSource is a DataTable
            If dt IsNot Nothing Then
                ' Check the table name against the parameter
                If dt.TableName = tableName Then
                    ' Found it !
                    Return bs
                End If
            End If
        End If
    Next

    ' Oops, BindingSource not found
    Return Nothing

End Function

РЕДАКТИРОВАТЬ: кажется, что подсветка синтаксиса SO имеет проблемы с VB ...

0 голосов
/ 24 февраля 2010

Лично, если есть только три BindingSources, почему бы просто не получить к ним доступ напрямую, а не через коллекцию? Если это просто для того, чтобы код был в состоянии выполнить его через цикл, я не вижу особой выгоды. Однако, если это то, что вы хотите сделать, один из способов сделать это - инициализировать BindingSources в конструкторе Form или UserControl (вне метода InitializeComponents) и вручную добавить их в коллекцию Components. Это позволит вам назначить имя в качестве ключа для BindingSource в коллекции Components. Затем вы можете получить к ним доступ следующим образом: (простите мой C #, я не очень хорошо говорю на VB, но вы получите jist)

BindingSource bs1 = new BindingSource();
BindingSource bs2 = new BindingSource();
BindingSource bs3 = new BindingSource();

// set properties on BindingSources....

// add BindingSources to componenents collection manually.
// add a name key
components.Add(bs1, "BindingSource1");
components.Add(bs2, "BindingSource2");
components.Add(bs3, "BindingSource3");

// access the BindingSource
BindingSource bsSelected = components.Components["BindingSource" + SelectedBindingSourceID] as BindingSource;
if (bsSelected == null)
{
    throw new Exception("BindingSource" + 
                         SelectedBindingSourceID + " doesn't exist");
}

Это не красиво, но может вам помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...