Что мне не хватает привязки оконных форм к дозвуковым

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

Вот мое событие загрузки формы:

Private prt As New DataAccess.Part

Private Sub Form_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim lc As System.Web.UI.WebControls.ListItemCollection = DataAccess.Part.GetListItems()
        cboParts.DataSource = lc
        lstParts.DataSource = lc

        txtPartBefore.DataBindings.Add(New Binding("Text", prt, "PartNumBefore", True, DataSourceUpdateMode.OnPropertyChanged))
        txtPartAfter.DataBindings.Add(New Binding("Text", prt, "PartNumAfter", True, DataSourceUpdateMode.OnPropertyChanged))
        txtOperation.DataBindings.Add(New Binding("Text", prt, "Operation", True, DataSourceUpdateMode.OnPropertyChanged))
        txtNotes.DataBindings.Add(New Binding("Text", prt, "Notes", True, DataSourceUpdateMode.OnPropertyChanged))

End Sub

И SelectedIndexChange для списка:

Private Sub lstParts_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lstParts.SelectedIndexChanged

    Dim ctl As ListControl = DirectCast(sender, ListControl)

    prt = DataAccess.Part.FetchByID(ctl.SelectedValue.value)

End Sub

Я использую VB.Net 2005, но при необходимости могу преобразовать ваши предложения из С#;)

Спасибо, Тони В.


person Tony W    schedule 07.05.2009    source источник


Ответы (3)


На самом деле вы не привязываете новое выбранное значение к текстовым полям. Все, что вы делаете, это меняете свою ссылку (prt), чтобы она указывала с исходного объекта привязки на другой объект, который был только что выбран пользователем.

Вам нужно сделать что-то вроде этого:

    Private Sub lstParts_SelectedIndexChanged(
        ByVal sender As System.Object, ByVal e As System.EventArgs) 
        Handles lstParts.SelectedIndexChanged

        Dim ctl As ListControl = DirectCast(sender, ListControl)

        prt = DataAccess.Part.FetchByID(ctl.SelectedValue.value)

        BindControls(prt)
    End Sub

    Sub BindControls(ByVal newPart as DataAccess.Part)
        txtPartBefore.DataBindings.Clear()
        txtPartAfter.DataBindings.Clear()
        txtOperation.DataBindings.Clear()
        txtNotes.DataBindings.Clear()

        txtPartBefore.DataBindings.Add(
            New Binding("Text", newPart, "PartNumBefore", True, 
            DataSourceUpdateMode.OnPropertyChanged))
        txtPartAfter.DataBindings.Add(
            New Binding("Text", newPart, "PartNumAfter", True, 
            DataSourceUpdateMode.OnPropertyChanged))
        txtOperation.DataBindings.Add(
            New Binding("Text", newPart, "Operation", True, 
            DataSourceUpdateMode.OnPropertyChanged))
        txtNotes.DataBindings.Add(
            New Binding("Text", newPart, "Notes", True, 
            DataSourceUpdateMode.OnPropertyChanged))
    End Sub
person Joseph    schedule 07.05.2009
comment
Тем не менее, выбор этого маршрута как бы побеждает установленный и забытый менталитет привязки данных. Лучше привязываться к постоянному объекту один раз, чем каждый раз уничтожать и воссоздавать привязки данных. - person Adam Robinson; 07.05.2009
comment
Не совсем, в том смысле, как он его использует, привязка данных не отвечает за знание того, когда пользователь намеревается изменить, какой объект сам привязывается к данным. Проблема не в привязке данных, а в намерении изменить то, что привязано к данным. - person Joseph; 07.05.2009

Ваша проблема заключается в том, что вы назначаете prt в своем коде. Ваши элементы управления привязываются к любой ссылке, на которую указывает prt во время создания привязок. Когда вы назначите его позже, элементы управления не указывают на это.

Что вам нужно сделать, так это добавить компонент BindingSource, чтобы он указывал на тип объекта, которым является prt, а затем привязать свои элементы управления к компоненту BindingSource. Когда вам нужно получить, установите свойство DataSource объекта BindingSource в качестве извлеченного объекта.

person Adam Robinson    schedule 07.05.2009

Вы должны привязаться к свойству «Prt»:

public DataAccess.Part Prt { get { return prt; } set { prt = value; } }

or

Public Property Prt() As DataAccess.Part
Get
  Return prt
End Get
Set(ByVal Value As DataAccess.Part)
  prt = value
End Set
End Property
person P a u l    schedule 07.05.2009