2016-05-12 58 views
0

所以後續問題,我想出瞭如何通過電子郵件從表單發送電子郵件和發送文本,但我有一些麻煩引用列表視圖數據電子郵件部分的正文。引用列表視圖與電子郵件部分使用vb.net

結果出現爲:電子郵件中的「Lis Lis」。

即使我在列表視圖中有3列和兩行數據。我不知道如何引用列表視圖,任何人有任何想法?代碼如下所示。

Private Sub LoadPDF_Data() 
    sqlCon = New SqlConnection(stlCon) 

    Using (sqlCon) 

     Dim sqlComm As New SqlCommand 


     sqlComm.Connection = sqlCon 


     sqlComm.CommandText = "sp_GetDocs" 
     sqlComm.CommandType = CommandType.StoredProcedure 

     sqlComm.Parameters.AddWithValue("@DOCID", Integer.Parse(TextBox1.Text.Trim())) 

     sqlCon.Open() 
     Dim sqlReader As SqlDataReader = sqlComm.ExecuteReader() 

     Using sqlReader 
      Dim table As New DataTable 
      table.Load(sqlReader) 

      ListView1.View = View.Details 
      ListView1.GridLines = True 
      ListView1.Columns.Add("PDF Name", 200, HorizontalAlignment.Left) 
      ListView1.Columns.Add("PDF Description", 200, HorizontalAlignment.Left) 
      ListView1.Columns.Add("PDF Location", 200, HorizontalAlignment.Left) 

      For Each row In table.Rows 

       Dim PDF As New ListViewItem 
       PDF.Text = row.Item(0) 
       PDF.SubItems.Add(row.item(1)) 
       PDF.SubItems.Add(row.item(2)) 

       For i = 1 To table.Columns.Count - 1 
        PDF.SubItems.Add(row(i).ToString(0)) 
        PDF.SubItems.Add(row(i).ToString(1)) 
        PDF.SubItems.Add(row(i).ToString(2)) 

       Next 
       ListView1.Items.Add(PDF) 
      Next 
      ListView1.EndUpdate() 

     End Using 

    End Using 

End Sub 
Private Function BuildTheListViewItemsToSend(ByVal path As ListView) 

    Dim sb As New System.Text.StringBuilder 

    For Each item As ListViewItem In ListView1.Items 
     For i = 1 To ListView1.Items.Count - 1 
      sb.Append((ListView1.Items(i).ToString(0)) & (ListView1.Items(i).ToString(1)) & (ListView1.Items(i).ToString(2)) & vbCrLf) 
     Next 

    Next 

    Return sb.ToString() 

End Function 
Private Sub EmailInfo() 
    Dim MailFrom As System.Net.Mail.MailAddress 
    Dim MailTo As System.Net.Mail.MailAddress 
    Dim MailSubject As String 
    Dim MailBody As String 
    Dim Mail As New MailMessage 
    Dim MailClient As SmtpClient 
    Dim List As String = BuildTheListViewItemsToSend(ListView1) 

    Try 
     MailBody = (BuildTheListViewItemsToSend(ListView1)) 

     MailSubject = ("Documents for the DOCID: " + TextBox1.Text) 
     MailFrom = New MailAddress(TextBox2.Text) 
     MailTo = New MailAddress(TextBox3.Text) 

     Mail.From = MailFrom 
     Mail.To.Add(MailTo) 
     Mail.Subject = MailSubject 
     Mail.Body = MailBody 



     MailClient = New SmtpClient("smtp.office365.com") 
     MailClient.Port = 587 
     MailClient.EnableSsl = True 
     MailClient.Credentials = New System.Net.NetworkCredential(TextBox2.Text, "password", "domain") 

     MailClient.Send(Mail) 
     MsgBox("Email Sent") 
    Catch ex As Exception 
     MsgBox("Error") 
    End Try 

End Sub 

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    LoadPDF_Data() 
End Sub 

Private Sub ListView1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ListView1.SelectedIndexChanged 

End Sub 

Private Sub Email_Click(sender As Object, e As EventArgs) Handles Email.Click 
    EmailInfo() 
End Sub 

回答

1

這是您的問題代碼,對不對?

For Each item As ListViewItem In ListView1.Items 
    For i = 1 To ListView1.Items.Count - 1 
     sb.Append((ListView1.Items(i).ToString(0)) & (ListView1.Items(i).ToString(1)) & (ListView1.Items(i).ToString(2)) & vbCrLf) 
    Next 

Next 

裏面你For Each迴路列表視圖中的項目,您是通過同一個集合循環第二次,並試圖通過.ToString(0)訪問列。您需要將每個ListViewItem(每行)的SubItems(列)更深入地移入一個級別。

以下使用For Each所以你不必亂七八糟索引。它訪問所有子項目,然後在移到下一行之前添加新行。

For Each item As ListViewItem In ListView1.Items 
    For Each subitem As ListViewSubItem In item.SubItems 
     sb.Append(subitem.Text) 
    Next 
    sb.Append(vbCrLf) 
Next 
+0

非常感謝你的工作!最後一個問題,如果我想將它的格式設置爲表格格式,我會在電子郵件部分或BuildTheListViewItemsToSend部分將其格式化爲電子郵件的結果。我可以使用在開始時使用的相同格式嗎?我很抱歉問了很多問題,我仍然對vb.net –

+0

不熟悉。因爲這些列是長度可能有很大變化的文本,所以如果沒有可用的表格,將很難進行格式化。最簡單的解決方案是將它格式化爲塊(我無法在評論中正確格式化) –

+0

哈哈我看到謝謝你的所有幫助,這有助於獲取電子郵件中數據的最大障礙,謝謝! –

1

您正在函數中循環兩次ListView項目。此代碼會將您的ListView內容變成字符串:

For Each item As ListViewItem In ListView1.Items 
     For Each column As ListViewSubItem In item.SubItems 
      sb.Append(column.Text) 
     Next 
     sb.Append(vbCrLf) 
    Next 

希望您可以根據自己的需要調整它。

+0

感謝您的回覆!我調整它像子程序員如何在下面陳述的子項目,它的工作原理只剩下格式化電子郵件的問題,我不知道在電子郵件部分或BuildListview部分將如何去像 –

+0

嗨,你必須在BuildTheListViewItemsToSend方法。你做什麼取決於你希望郵件的外觀。您是否打算髮送HTML格式的電子郵件,這將使您在外觀或簡單文本郵件方面擁有更大的靈活性。如果你只是將行改爲'sb.Append(column.Text + vbTab)',它會在電子郵件中看起來更好,但並不總是完美的 – OldBoyCoder

+0

它使事情變得更好:)非常感謝你 –