2014-10-16 46 views
0

我是vb.net中的新手,對VB的所有功能都不太熟悉。在處理1個Windows應用程序的同時,我們需要保存產品及其規格,如重量,高度,寬度,顏色,長度,材料等。 由於每個產品都可能有不同的規格,因此無法確定和提供數據庫中的字段。加入不同文本框的字符串並重新分割

因此,我決定提供文本框,以便用戶在輸入產品詳細信息時可以輸入名稱&值。 1文本框名稱&其他文本框的值。 這樣

Textbox1 = "WEIGHT"  TextBox2 = "10" '(Value of Weight) 
Textbox3 = "WIDTH"  TextBox4 = "5" '(value of Width) 
Textbox4 = "LENGTH"  TextBox5 = "5" '(Value of Length) 

相反節省產品說明書中在分離柱的(所有這些文本框被動態地在組框「GBox1」創建)。我想將這些名稱&的值保存爲字符串,例如SQL數據庫(TEXT OR VARCHAR字段)中的「WEIGHT = 10; WIDTH = 5; LENGTH = 5」。因爲我們不需要任何計算或搜索等。只是客戶要求訂購&保存在數據庫中以備將來記錄。

然後再次儘管主叫或編輯產品SPLIT字符串作爲單獨的字段,字符串之前=獨立&串後=單獨的,則在文本框顯示的所有名稱&及其對應的值(如顯示,同時加入),從而用戶可以經過編輯和另存爲單個字符串值。

搜索後,我發現SPLIT & JOIN功能用於此目的。 需要在循環中使用這些功能合併來自每個循環的文本框 串閱讀GROUPBOX

Dim ItemList As New ArrayList() 
Dim PrDetails As String 
For Each Ctrl As Control In GBox1.Controls 
    If TypeOf Ctrl Is TextBox Then 
     ItemList.Add(CType(Ctrl, TextBox).Text) 
    End If 
Next 
PrDetails = String.Join() 

所有文本框如何執行加入這些數組列表上的一些幫助嗎?並在從數據庫中檢索時再次分割此模式。

此外還需要有關此方法或任何其他方式來實施的建議。謝謝。

+1

這是很多工作。在你採取的方法中,如果你想按照其中一個或多個屬性進行排序,那將非常痛苦。也許你需要一個產品規格表? – Tim 2014-10-16 19:44:30

+0

'ArrayList's是舊的,而不是類型特定請考慮一個'List(Of String)'而不是。 – OneFineDay 2014-10-16 20:01:28

+0

我會考慮將數據保存爲XML。如果您正在使用SQL Server(或其他一些頂級域名),那麼您也可以從數據庫中直接查詢這些信息。 – Steve 2014-10-16 20:41:14

回答

0

對於此解決方案的工作,您需要接受一個事實,即您的解決方案需要有一些標準化量。 TextBox1TextBox3不能用作名稱,所以我使用了txtName1txtValue1等。要測試此解決方案,請創建一個新表單,將GroupBox1粘貼到類中並運行。

Private nameTextBoxName = "txtName" ' name textbox prefix 
Private valueTextBoxName = "txtValue" ' value textbox prefix 
Private paramSeparator = ";" ' between sets of parameters 
Private nameAndValueSeparator = "=" ' between name and value 
Private xOffset = 10 ' for horizontal spacing inside the groupbox 
Private yOffset = 20 ' for vertical spacing inside the groupbox 

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    ' your example data 
    Dim testString = "WEIGHT=10;WIDTH=5;LENGTH=5" 
    ' set the textboxes 
    setTextBoxes(testString) 
    ' get the string from the textboxes 
    Dim result = getTextBoxesString() 
End Sub 

' call to get a string with all the data from the textboxes 
Private Function getTextBoxesString() As String 
    Dim stringToDatabase = "" 
    Dim textBoxes = GroupBox1.Controls.OfType(Of Control). 
     Where(Function(co As Control) TypeOf co Is TextBox). 
     Select(Of TextBox)(Function(co As Control) CType(co, TextBox)) 
    Dim nameTextBoxes = textBoxes.Where(Function(co As Control) co.Name.Contains(nameTextBoxName)) 
    Dim valueTextBoxes = textBoxes.Where(Function(co As Control) co.Name.Contains(valueTextBoxName)) 
    stringToDatabase = nameTextBoxes.Select(Of String)(
     Function(nameTextBox As TextBox) 
      Dim valueTextBox = valueTextBoxes. 
       Where(Function(vtb As TextBox) vtb.Name = nameTextBox.Name.Replace(nameTextBoxName, valueTextBoxName)). 
       First() 
      Return nameTextBox.Text & nameAndValueSeparator & valueTextBox.Text 
     End Function).Aggregate(Function(oldValue, newValue) oldValue & paramSeparator & newValue) 
    Return stringToDatabase 
End Function 

' call to set the textboxes inside the groupbox based on the data string 
Private Sub setTextBoxes(textBoxesString As String) 
    Dim params = textBoxesString.Split(paramSeparator) 
    Dim index = 1 
    GroupBox1.Controls.Clear() 
    For Each param In params 
     Dim nameAndValue = param.Split(nameAndValueSeparator) 
     Dim nameTextBox As New TextBox With 
      {.Name = nameTextBoxName & index.ToString(), 
      .Text = nameAndValue(0), 
      .Location = New Point(xOffset, (index - 1) * .Height + yOffset)} 
     Dim valueTextBox As New TextBox With 
      {.Name = valueTextBoxName & index.ToString(), 
      .Text = nameAndValue(1), 
      .Location = New Point(.Width + xOffset, (index - 1) * .Height + yOffset)} 
     GroupBox1.Controls.Add(nameTextBox) 
     GroupBox1.Controls.Add(valueTextBox) 
     index += 1 
    Next 
End Sub 
+0

它的工作完美,有一些修改m能夠以我的形式實施:) – Vehlad 2014-10-17 14:29:27