0

我正在用 VB 编写一个应用程序,在其中我需要向用户显示一些信息,这些信息将被复制并粘贴到另一个应用程序中,但是另一个应用程序的限制意味着字符串需要分成不超过 55 个字符的块(它是只是写了笔记)。我认为做到这一点的最简洁的方法是有几个文本框,每个文本框都有一个“复制到剪贴板”按钮,以方便用户使用。

我的代码是:

Dim invdesc As List(Of String) = Split(splitstring, 55)
                    txtinvDesc1.Text = invdesc(0)
                    txtinvDesc2.Text = invdesc(1)
                    txtinvDesc3.Text = invdesc(2)
                    ...

Split 使用正则表达式返回多行列表而不分解单词,大多数情况下,这将返回最多七个结果,但偶尔会返回六个(我的原始字符串最大长度为 330),而且通常更少,所以我最初的想法要填写任何小于 330 且带有尾随空格的字符串都不起作用,因为我仍然可能会错过文本或调用不存在的结果。

理想情况下,我只会做某种循环,当有可用数据时只输入到 txtinvDesc(x) 并忽略其余部分(或隐藏它们),但我不知道除了显式或如何引用文本框之外的任何方法将它们放在任何类型的列表/数组中。

所以在“我怎样才能最好地处理这个要求?”这个问题有点悬而未决。

4

3 回答 3

2

您可以使用任何其他类型/类创建一个集合(例如,ArrayListTextBox(就像您String在代码中所做的那样)。样本:

Dim allTextBoxes As New List(Of TextBox)
allTextBoxes.Add(txtinvDesc1)
allTextBoxes.Add(txtinvDesc2)
allTextBoxes.Add(txtinvDesc3)

或者,您可以通过检查其类型(是否为文本框)来遍历主窗体中的所有控件。在这种情况下,您必须通过其他集合设置文本框的给定名称和数据列表索引之间的关系,例如:

Dim mappingList As New List(Of String)
mappingList.Add("txtinvDesc1")
mappingList.Add("txtinvDesc2")
mappingList.Add("txtinvDesc3")

For Each ctr As Control In Me.Controls
    If (TypeOf ctr Is TextBox AndAlso mappingList.Contains(ctr.Name)) Then
        ctr.Text = invdesc(mappingList.IndexOf(ctr.Name))
    End If
Next

--- 澄清(不像我想象的那么明显)

为每个循环提出的建议依赖于一种映射方法,也就是说,它将每个元素invdesc与相应的 TextBox 名称相关联。根据定义,两个数组必须具有相同数量的元素(否则映射系统将没有任何意义)。这是最有效和全面适用的替代方案;如果文本框的名称invdesc有共同的元素(例如,数字),您可能只是比较名称。但是在映射时,您必须考虑所有元素(如果给定项目没有关联的 TextBox,则将值留空;但必须考虑所有项目)。

于 2013-10-04T11:54:26.347 回答
1

如果要索引 tbs:

Private TBs as New List (of TextBox)

早期(在 FormLoad 之后)可能在 FormSetup 中:

TBs.Add(txtinvDesc1)
TBs.Add(txtinvDesc2)
TBs.Add(txtinvDesc3)
...

然后:

Dim invdesc As List(Of String) = Split(splitstring, 55)

For n As Integer = 0 To invdesc.Count-1
     TBs(n).Text = invdesc(n)
Next

' handle the varying 7th TB:
For n As Integer = invdesc.Count-1 To TBs.Count - 1
     TBs(n).Enabled = False
     TBs(n).Text =""
Next

或 For/Each:

Dim ndx As Integer = 0
For Each tb As TextBox In TBs
    tb.Text = invdesc(ndx)
    ndx += 1                     ' thanks varo!
Next

然后隐藏/禁用或至少清除任何空文本中的文本。

如果事实证明总是有 6 个,那么你真的只需要一个 if 语句:

txtinvDesc1.Text = invdesc(0)
txtinvDesc2.Text = invdesc(1)
txtinvDesc3.Text = invdesc(2)
...
If incDesc.Count-1 = 6 Then              
     txtinvDesc7.Text = invdesc(6)
Else
     txtinvDesc7.Enabled= False
     txtinvDesc7.Text = ""
End If

我会更改 TB 名称开始txtinvDesc0.Text以避免混淆(我可能有)

于 2013-10-04T12:08:03.233 回答
0

使用多行文本框并在 OnKeyPress 事件中强制每行 55 个字符。您可以在此 SO 答案中找到具有该功能的子类 TextBox :

https://stackoverflow.com/a/17082189/351383

于 2013-10-04T12:18:13.160 回答