2012-11-25 34 views
0

VB.Net我使用兩種形式 - frmDetails,frmInventory frmInventory包含一個列表框,用於讀取包含列表框的文本文件書名,作者,類別,#庫存和每件物品的價格(五個要素)。列表框僅顯示書名。使用已從列表框中選擇的文本文件中的數據填充第二個表單

frmDetails包含與文本文件中的元素相匹配的單獨文本框。

如果用戶選擇frmInventory列表框中的一個項目(標題)並從下拉菜單中選擇更新,則frmDetails中的文本框需要填充與其標籤相匹配的元素(帶標題的標題,作者和作者等)。換句話說,選中後,需要讀取文本文件,解析數據並填充到每個文本框中。

我已經嘗試了幾種不同形式的代碼:

Dim selectedUpdate As String = lstBookList.SelectedItem.ToString 
If selectedUpdate = lstBookList.SelectedItem.ToString Then 
    Dim queryUpdate = From item In File.ReadAllLines("Books.txt") 
        Let ti = item.Split(","c)(0) 
        Let au = item.Split(","c)(1) 
        Let ca = item.Split(","c)(2) 
        Let qt = item.Split(","c)(3) 
        Let co = item.Split(","c)(4) 
        Where ti = selectedUpdate 
        Select ti & "," & au & "," & ca & "," & qt & "," & co 
    For Each ti In queryUpdate 
    frmDetails.txtTitle.Text = ti 
    For Each au In queryUpdate 
     frmDetails.txtAuthor.Text = au 
     For Each qt In queryUpdate 
     frmDetails.txtStock.Text = qt 
     For Each co In queryUpdate 
      frmDetails.txtPrice.Text = co 
     Next 
     Next 
    Next 
    Next 
End If 
frmDetails.ShowDialog() 
End Sub 

或者:

Dim selectedUpdate As String = lstBookList.SelectedItem.ToString 
Dim itemToUpdate() As String = File.ReadAllLines("Books.txt") 
If selectedUpdate = lstBookList.SelectedItem.ToString Then 
Dim queryTitle = From bookTitle In itemToUpdate 
        Let ti = bookTitle.Split(","c)(0) 
        Where ti = selectedUpdate 
        Select ti 
    For Each ti In queryTitle 
    frmDetails.txtTitle.Text = ti 
    Next 
    Dim queryAuthor = From bookAuthor In itemToUpdate 
        Let au = bookAuthor.Split(","c)(1) 
        Where au = selectedUpdate 
        Select au 
    For Each au In queryAuthor 
    frmDetails.txtAuthor.Text = au 
    Next 

或者:

Dim selectedUpdate As String = lstBookList.SelectedItem.ToString 
Dim itemToUpdate() As String = File.ReadAllLines("Books.txt") 
If selectedUpdate = lstBookList.SelectedItem.ToString Then 
    Dim queryUpdate = From item In File.ReadAllLines("Books.txt") 
        Let ti = item.Split(","c)(0) 
        Let au = item.Split(","c)(1) 
        Let ca = item.Split(","c)(2) 
        Let qt = item.Split(","c)(3) 
        Let co = item.Split(","c)(4) 
        Where ti = selectedUpdate 
        Select ti, au, ca, qt, co 
    frmDetails.txtTitle.Text = (queryUpdate.ToString) ti 
    frmDetails.txtAuthor.Text = au 
    frmDetails.txtStock.Text = qt 

的問題是,在記錄分析數據,以便它可以分散到不同的文本字段中。

任何援助將不勝感激。

+2

這不是100%清楚地知道你正在嘗試做的。更糟糕的是,你的代碼遵循非常差的編碼標準。當我看到4個這樣寫的嵌套循環時,我的眼睛受傷了。 '讓xx = item.Split(「,」c)(0)'也不好。沒有冒犯性,但我建議先閱讀一本關於VB.NET的書,然後開始編碼。否則,你會一直在每一個小問題上磕磕絆絆。 – Neolisk

+0

我不知道這是否是一些標準的家庭作業,但它類似於我最近看到的幾個問題。無論如何,看看我的答案在這裏:http://stackoverflow.com/questions/12574143/getting-started-on-inventory-program-in-vb/13543231#13543231它涉及到創建一個圖書類,閱讀所有書籍一個列表(書),所以你可以很容易地用linq查詢它。如果書籍列表太大而無法保存在內存中,我建議使用數據庫。 sqlite將是一個簡單的選項 – Steve

+0

通過這種方法,您可以將單個書籍對象傳遞給新的表單,並簡單地設置文本框,例如txtAuthor.Text = book.author,txtTitle.Text = book。標題等 – Steve

回答

0

好吧,我堅持我原來的意見,你應該創建一類書,並將文本文件讀入某種集合(書本)。

針對您的要求,綁定列表將是適當的。

一個例子:

Public Class frmInventory 
Public bookList As New BindingList(Of Book) 
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
    'Presumes each book is stored on one line, with data seperated with a ";" 
    'eg: Wrox Beginning Visual Basic 2010;Thearon Willis;non-fiction;100;17.5 
    Dim books As String() = IO.File.ReadAllLines("C:\Users\Admin\Documents\allBooks.txt") 

    For i = 0 To books.Count - 1 
     Dim bookdata As String() = books(i).Split(";") 
     bookList.Add(New Book(bookdata(0), bookdata(1), bookdata(2), CInt(bookdata(3)), CDbl(bookdata(4)))) 
    Next 

    'set listbox1 datasource to our newly populated bindinglist(of book) 
    ListBox1.DataSource = bookList 
    'set displaymember to title. Could be any one of the other attributes of book. 
    ListBox1.DisplayMember = "title" 
End Sub 

'When edit button is clicked: if you want the following to fire when an option is selected from a dropdown, handle accordingly 
Private Sub btnEditSelected_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEditSelected.Click 

    'the listbox contains book objects, not a string! This can catch people out 
    Dim selectedBook As Book = ListBox1.SelectedItem 
    'create an instance of frmDetails, and pass it the selected book object 
    Dim editform As New frmDetails(selectedBook) 
    'Show editform as model and if the user clicks the OK button on the model form: 
    If editform.ShowDialog() = DialogResult.OK Then 
     'replace the existing book object in booklist with the modified one. 
     bookList(bookList.IndexOf(selectedBook)) = selectedBook 
    End If 

End Sub 


End Class 

你frmDetails會是這個樣子:

Public Class frmDetails 
'auto property: creates a private book object called _book (note the underscore), see 
'http://msdn.microsoft.com/en-us/library/dd293589.aspx for more details on autoproperties 
Property book As Book 

'require a book object to be sent when a new instance is created, by reference so we can edit the actual book object, not a copy 
Public Sub New(ByRef book As Book) 

    _book = book 

    InitializeComponent() 

End Sub 

Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
    TextBox1.Text = _book.title 
    TextBox2.Text = _book.author 
    TextBox3.Text = _book.category 
    TextBox4.Text = _book.stock 
    TextBox5.Text = _book.wholesaleprice 
End Sub 

Private Sub btnOK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOK.Click 
    _book.title = TextBox1.Text 
    _book.author = TextBox2.Text 
    _book.category = TextBox3.Text 
    _book.stock = TextBox4.Text 
    _book.wholesaleprice = TextBox5.Text 
    DialogResult = DialogResult.OK 
End Sub 
End Class 

在設計,形式 '的AcceptButton' 屬性設置爲btnOK。你也應該設置其屬性按鈕取消到適當的按鈕

最後的書類自身:

Public Class Book 
Property title As String 
Property author As String 
Property category As String 
Property stock As Integer 
Property wholesaleprice As Double 

Public Sub New(ByVal title As String, ByVal author As String, ByVal category As String, ByVal stock As Integer, ByVal wholesaleprice As Double) 

    _title = title 
    _author = author 
    _category = category 
    _stock = stock 
    _wholesaleprice = wholesaleprice 
End Sub 
End Class 
相關問題