none
请问listview的DataBindings怎么使用? RRS feed

  • 问题

  • 我声明了一个dim a as list(of string),我想把它他绑定到listview1的items属性

    就是说,如果a的内容有变化,就自动在listview1中体现出来,不知该怎么弄

    看了一下DataBindings属性的帮助文件,看不懂,请高手指点一下,谢谢!

    最好直接给代码,因为我不是专业编程的,弄不懂太复杂的程序问题。


    Work8862

    2013年10月3日 3:19

答案

  • 这完全不是我想要的,我是在其他过程中改变了List(of string)的内容,然后想让listview的items与List(of string)内容保持同步,,

    就是说,只要List(of string)的内容变化了,listview就知道并且自动更新了自己的内容

    你的这种情况应该使用WPF双向绑定为妙。

    如果是WinForm,恐怕要自己构建这样的机制。先删除我先前全部的代码,然后:

    1)先创建一个类,如下:

    Public Class ObervationItem
        Inherits List(Of String)
        ''' <summary>
        ''' 字符串集合,允许对外公布
        ''' </summary>
        Private Property Values As List(Of String) = New List(Of String)
     
        ''' <summary>
        ''' 当对集合中添加,修改或者删除元素之后,会触发该事件
        ''' </summary>
        Public Event ValueChanged As Action(Of List(Of String))
     
        ''' <summary>
        ''' 增加
        ''' </summary>
        Public Sub AddNewItem(s As String)
            MyBase.Add(s)
            RaiseEvent ValueChanged(Values)
        End Sub
        ''' <summary>
        ''' 删除
        ''' </summary>
        Public Sub DeleteItem(s As String)
            MyBase.Remove(s)
            RaiseEvent ValueChanged(Values)
        End Sub
        ''' <summary>
        ''' 修改
        ''' </summary>
        ''' <param name="old">原字符串</param>
        ''' <param name="newS">新字符串</param>
        Public Sub Modify(old As StringnewS As String)
            Dim index As Integer = Me.IndexOf(old)
            If (index >= 0Then
                Me(index) = newS
                RaiseEvent ValueChanged(Values)
            End If
        End Sub
    End Class

    2)Form中这样使用:

    Public Class Form1
     
        Dim items As New ObervationItem
     
        Public Sub New()
            InitializeComponent()
     
            '绑定实时更新事件
            AddHandler items.ValueChangedAddressOf OnValueChanged
        End Sub
     
        ''' <summary>
        ''' 绑定和UI界面返回数据的事件
        ''' </summary>
        Private Sub OnValueChanged(arg As List(Of String))
            lstView.Items.Clear()
            For Each s As String In arg
                lstView.Items.Add(s)
            Next
        End Sub
    End Class

    3)以后,你只要调用ObervationItem的任意方法,都会自动触发事件重新绑定。


    Click For donating:Free Rice For the poor
    For spamming-sender issues, you can either report it at Microsoft Spamming Issue, or just find "Report Spam Here+Number" at Forum Issue;You can also find "Verify Your Account+Number" at "Forum Issue", where you can submit to be confirmed to paste links or images.
    For more things to talk about? StackOverFlow is your choice.

    2013年10月3日 6:23
    版主

全部回复

  • 不建议用DataBinding,因为这个属性绑定的是一个公开的属性。而String公开的属性并不是String的字面数值。你就可以先定义一个类,然后手动触发事件即可。

    1)必须把ListBox的“视图”改为(List)。

    2)LabelEdit=True。

    3)如下代码:

    Public Class Form1
        ''' <summary>
        ''' 初始化数据
        ''' </summary>
        Dim lstStrings As New List(Of String)
     
        Public Sub New()
     
            ' 此调用是设计器所必需的。
            InitializeComponent()
     
            ' 在 InitializeComponent() 调用之后添加任何初始化。
     
            For index = 1 To 10
                lstStrings.Add(index.ToString())
                '加入ListBox
                lstView.Items.Add(index.ToString())
            Next
        End Sub
     
        '编辑之后自动更新列表
        Private Sub lstView_AfterLabelEdit(sender As Objecte As LabelEditEventArgsHandles lstView.AfterLabelEdit
            lstStrings(e.Item) = e.Label
        End Sub
    End Class

    Click For donating:Free Rice For the poor
    For spamming-sender issues, you can either report it at Microsoft Spamming Issue, or just find "Report Spam Here+Number" at Forum Issue;You can also find "Verify Your Account+Number" at "Forum Issue", where you can submit to be confirmed to paste links or images.
    For more things to talk about? StackOverFlow is your choice.

    2013年10月3日 4:01
    版主
  • 这完全不是我想要的,我是在其他过程中改变了List(of string)的内容,然后想让listview的items与List(of string)内容保持同步,,

    就是说,只要List(of string)的内容变化了,listview就知道并且自动更新了自己的内容


    Work8862

    2013年10月3日 5:52
  • 这完全不是我想要的,我是在其他过程中改变了List(of string)的内容,然后想让listview的items与List(of string)内容保持同步,,

    就是说,只要List(of string)的内容变化了,listview就知道并且自动更新了自己的内容

    你的这种情况应该使用WPF双向绑定为妙。

    如果是WinForm,恐怕要自己构建这样的机制。先删除我先前全部的代码,然后:

    1)先创建一个类,如下:

    Public Class ObervationItem
        Inherits List(Of String)
        ''' <summary>
        ''' 字符串集合,允许对外公布
        ''' </summary>
        Private Property Values As List(Of String) = New List(Of String)
     
        ''' <summary>
        ''' 当对集合中添加,修改或者删除元素之后,会触发该事件
        ''' </summary>
        Public Event ValueChanged As Action(Of List(Of String))
     
        ''' <summary>
        ''' 增加
        ''' </summary>
        Public Sub AddNewItem(s As String)
            MyBase.Add(s)
            RaiseEvent ValueChanged(Values)
        End Sub
        ''' <summary>
        ''' 删除
        ''' </summary>
        Public Sub DeleteItem(s As String)
            MyBase.Remove(s)
            RaiseEvent ValueChanged(Values)
        End Sub
        ''' <summary>
        ''' 修改
        ''' </summary>
        ''' <param name="old">原字符串</param>
        ''' <param name="newS">新字符串</param>
        Public Sub Modify(old As StringnewS As String)
            Dim index As Integer = Me.IndexOf(old)
            If (index >= 0Then
                Me(index) = newS
                RaiseEvent ValueChanged(Values)
            End If
        End Sub
    End Class

    2)Form中这样使用:

    Public Class Form1
     
        Dim items As New ObervationItem
     
        Public Sub New()
            InitializeComponent()
     
            '绑定实时更新事件
            AddHandler items.ValueChangedAddressOf OnValueChanged
        End Sub
     
        ''' <summary>
        ''' 绑定和UI界面返回数据的事件
        ''' </summary>
        Private Sub OnValueChanged(arg As List(Of String))
            lstView.Items.Clear()
            For Each s As String In arg
                lstView.Items.Add(s)
            Next
        End Sub
    End Class

    3)以后,你只要调用ObervationItem的任意方法,都会自动触发事件重新绑定。


    Click For donating:Free Rice For the poor
    For spamming-sender issues, you can either report it at Microsoft Spamming Issue, or just find "Report Spam Here+Number" at Forum Issue;You can also find "Verify Your Account+Number" at "Forum Issue", where you can submit to be confirmed to paste links or images.
    For more things to talk about? StackOverFlow is your choice.

    2013年10月3日 6:23
    版主