Чего мне не хватает ... Windows связывает формы с дозвуковой - PullRequest
1 голос
/ 07 мая 2009

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

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

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, но могу конвертировать ваши предложения из C # при необходимости;)

Спасибо Тони W

Ответы [ 3 ]

1 голос
/ 07 мая 2009

Вы на самом деле не привязываете новое Выбранное значение к текстовым полям. Все, что вы делаете, это изменяете вашу ссылку (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
0 голосов
/ 07 мая 2009

Вы бы привязали к свойству 'Prt':

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

или

Public Property Prt() As DataAccess.Part
Get
  Return prt
End Get
Set(ByVal Value As DataAccess.Part)
  prt = value
End Set
End Property
0 голосов
/ 07 мая 2009

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

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

...