2017-02-26 101 views
0

这里是我的代码显示文本到文本框不同

Module Module1 
Public Conn As New ADODB.Connection 
Public rs As New ADODB.Recordset 
Public sql As String 

Public Function Connection() 
    Conn = New ADODB.Connection 
    Conn.ConnectionString = "Provider = Microsoft.Jet.OLEDB.4.0;Data Source = " & My.Application.Info.DirectoryPath & "\Database1.mdb" 
    Conn.Open() 
End Function 

载入我的数据到ListView

Private Sub ApplicationDesignForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
    Connection() 
    sql = "Select * From App" 
    rs.Open(sql, Conn) 
    While Not rs.EOF 
     Dim item As ListViewItem = ListView1.Items.Add(rs.Fields("QRCode").Value) 
     item.SubItems.Add(rs.Fields("Category").Value) 
     item.SubItems.Add(rs.Fields("LastName").Value & ", " & rs.Fields("FirstName").Value & ", " & rs.Fields("MI").Value) 
     item.SubItems.Add(rs.Fields("Gender").Value) 
     item.SubItems.Add(rs.Fields("Address").Value) 
      ListView1.FullRowSelect = True 
      rs.MoveNext() 
    End While 
    Conn.Close() 

转让我的数据文本框。

If Not ListView1.SelectedItems.Count = 0 Then 
     txtqrCode.Text = ListView1.Items(ListView1.SelectedIndices(0)).Text 
     cbCategory.Text = ListView1.Items(ListView1.SelectedIndices(0)).SubItems(1).Text 
     txtFirstName.Text = ListView1.Items(ListView1.SelectedIndices(0)).SubItems(2).Text 
     cbGender.Text = ListView1.Items(ListView1.SelectedIndices(0)).SubItems(3).Text 
     txtAddress.Text = ListView1.Items(ListView1.SelectedIndices(0)).SubItems(4).Text 

但问题是全名只在名字文本框中,而不是由姓氏,名字和中间初始文本框分开。我卡住了,想分开姓氏,名字和MiddeInitial。非常感谢任何建议或意见。 Here is the result

+1

将数据添加到LV时,将第一个和最后一个连接起来。控制不能撤销你所做的。对于数据库来说,DataGridView是更好的选择,可以减少需求代码并提供更好的数据类型。 – Plutonix

+0

其实先生。我们的教练只允许我们使用LV并采用硬编码的方式。我想不出其他解决方案。 –

+0

您能否提出其他解决方案(先生)?我卡住了,想不到更好的解决方案。 –

回答

0

首先我会看检查是否存在声母和跳过额外的逗号,如果它不

If rs.Fields("MI").Value & "" <> "" then 
     item.SubItems.Add(rs.Fields("LastName").Value & ", " & rs.Fields("FirstName").Value & ", " & rs.Fields("MI").Value) 
else 
     item.SubItems.Add(rs.Fields("LastName").Value & ", " & rs.Fields("FirstName").Value) 
end if 

那么你可以掰开全称适当

' I'd use an intermediate variable here, just so you can see what is happening while debugging. 
    Dim FullName as string = ListView1.Items(ListView1.SelectedIndices(0)).SubItems(2).Text 
    Dim NMA() As String = Split(FullName, ", ", 3) 
    Redim Preserve NMA(2) '<--- make sure we have three parts 
    txtLastName.text = NMA(0) 
    txtFirstName.text = NMA(1) 
    txtInitials.text = NMA(2) 

注意:在拆分功能中,3将拆分限制为三项。这似乎并不重要,但是,没有保证某些用户不会在名称字段中的某个地方添加“...”,例如,第一个名字是“Charles,The 3rd”。使用长度限制器可以确保在第二个“...”之后留下的任何东西都会被放入缩写字段。

我还用随着有块有点提高了工作效率....

With ListView1.Items(ListView1.SelectedIndices(0)) 
    .... 
    Dim FullName as string = .SubItems(2).Text 
    .... 
End With 

但是:没有与分崩离析串的问题...的姓氏可能包含在其中的“,”。因此,您的文本框可能不包含使用此方法的正确数据库值

因此,您最好从其他地方获取值。直接从数据库直接读取数据库,或者更好地将它们存储到其他列表类型结构中。

喜欢的东西...

Private QR_Records As New List(Of QR_REcord) 
Private Structure QR_Record 
    Public Code As String 
    Public Category As String 
    Public Name_Last As String 
    Public Name_First As String 
    Public Name_Initials As String 
    'etc 

    Public ReadOnly Property Name_Full() As String 
     Get 
      If Name_Initials.Length > 0 Then 
       Return (Name_Last & ", " & Name_First & ", " & Name_Initials) 
      Else 
       Return (Name_Last & ", " & Name_First) 
      End If 
     End Get 
    End Property 
End Structure 

然后建立一个从数据库读取功能以及直接选择列表索引引用它。

With QR_Records(ListView1.SelectedIndices(0)) 
    .... 
    Dim FullName as string = .Name_Full 
    .... 
End With 

奖金:使用这种方法的好处是,你可以使用ListView在VIRTUAL MODE,这将给你很多很多更好的性能,当有大量的记录。

出于这个原因,我实际上做的ListViewItem的QR_Record的属性如下

Public ReadOnly Property List_Item() as ListViewItem 
    Get 
     Dim Item As new ListViewItem 
     Item.Text = Code 
     item.SubItems.Add(Category) 
     item.SubItems.Add(Name_Full) 
     .... 
     Return Item 
    End Get 
End Property 

说了这么多:正如其他人所指出的那样......这确实是不正确的方法这是整个问题。