【问题标题】:calculate location on additional Textbox on each button click在每个按钮单击时计算附加文本框上的位置
【发布时间】:2016-12-08 06:32:22
【问题描述】:

我正在努力在每次单击按钮时添加一组文本框,但下一组文本框的位置应参考先前创建的文本框。

这是屏幕截图。

这是点击“更多”按钮之前的第一张图片

下一步是单击更多按钮一次之后。

但在再次单击更多按钮后。每个文本框之间的间距太远了。

我知道我的位置代码有问题。谁能帮我检查一下。

Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles addbox.Click

    Dim Count = gbox2.Controls.OfType(Of TextBox)().ToList().Count

    For i As Integer = 1 To 6
        Dim txtbox As New TextBox()
        Select Case i
            Case 1
                txtbox.Location = New System.Drawing.Point(17, 30 * Count)
                txtbox.Size = New System.Drawing.Size(43, 26)
                txtbox.Name = "itemno2" & (Count + 1)
                gbox2.Controls.Add(txtbox)

            Case 2
                txtbox.Location = New System.Drawing.Point(81, 30 * Count)
                txtbox.Size = New System.Drawing.Size(43, 26)
                txtbox.Name = "unit2" & (Count + 1)
                gbox2.Controls.Add(txtbox)

            Case 3
                txtbox.Location = New System.Drawing.Point(142, 30 * Count)
                txtbox.Size = New System.Drawing.Size(254, 26)
                txtbox.Name = "itemdesc2" & (Count + 1)
                gbox2.Controls.Add(txtbox)

            Case 4
                txtbox.Location = New System.Drawing.Point(417, 30 * Count)
                txtbox.Size = New System.Drawing.Size(56, 26)
                txtbox.Name = "requan2" & (Count + 1)
                gbox2.Controls.Add(txtbox)

            Case 5
                txtbox.Location = New System.Drawing.Point(21, 30 * Count)
                txtbox.Size = New System.Drawing.Size(56, 26)
                txtbox.Name = "issuequan2" & (Count + 1)
                gbox3.Controls.Add(txtbox)

            Case 6
                txtbox.Location = New System.Drawing.Point(94, 30 * Count)
                txtbox.Size = New System.Drawing.Size(144, 26)
                txtbox.Name = "remarks2" & (Count + 1)
                gbox3.Controls.Add(txtbox)

        End Select

    Next
    'addbox.Visible = False
    save.Visible = False
End Sub

任何帮助将不胜感激。提前致谢。

【问题讨论】:

  • 您应该有一个变量来存储最后一个文本框的当前顶部位置。单击按钮时,将文本框的高度添加到此变量 + 文本框行之间的空格。初始顶部应该相对于您的分组框

标签: vb.net textbox


【解决方案1】:
Dim currentTop As Integer = 5
Dim defaultHeight As Integer = 26

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim Count = gbox2.Controls.OfType(Of TextBox)().ToList().Count

    currentTop += defaultHeight + 5

    For i As Integer = 1 To 6
        Dim txtbox As New TextBox()
        Select Case i
            Case 1
                txtbox.Location = New System.Drawing.Point(17, currentTop)
                txtbox.Size = New System.Drawing.Size(43, 26)
                txtbox.Name = "itemno2" & (Count + 1)
                gbox2.Controls.Add(txtbox)

            Case 2
                txtbox.Location = New System.Drawing.Point(81, currentTop)
                txtbox.Size = New System.Drawing.Size(43, 26)
                txtbox.Name = "unit2" & (Count + 1)
                gbox2.Controls.Add(txtbox)

            Case 3
                txtbox.Location = New System.Drawing.Point(142, currentTop)
                txtbox.Size = New System.Drawing.Size(254, 26)
                txtbox.Name = "itemdesc2" & (Count + 1)
                gbox2.Controls.Add(txtbox)

            Case 4
                txtbox.Location = New System.Drawing.Point(417, currentTop)
                txtbox.Size = New System.Drawing.Size(56, 26)
                txtbox.Name = "requan2" & (Count + 1)
                gbox2.Controls.Add(txtbox)

            Case 5
                txtbox.Location = New System.Drawing.Point(21, currentTop)
                txtbox.Size = New System.Drawing.Size(56, 26)
                txtbox.Name = "issuequan2" & (Count + 1)
                gbox3.Controls.Add(txtbox)

            Case 6
                txtbox.Location = New System.Drawing.Point(94, currentTop)
                txtbox.Size = New System.Drawing.Size(144, 26)
                txtbox.Name = "remarks2" & (Count + 1)
                gbox3.Controls.Add(txtbox)

        End Select

    Next
End Sub

【讨论】:

  • 嗯,感谢您的帮助,但是当我再次单击“更多”按钮时,似乎没有显示文本框。
  • 我创建了一个按钮。您的按钮名称是 addbox。改个名字就行了
【解决方案2】:

为工作使用正确的工具 - DataGridView Control

您可以在DataGridView 中添加一行,而不是计算位置和添加文本框。
您可以为“申请”和“发行”组使用两个 DataGridView 控件。

在设计器中创建两个DataGridView 并添加您需要的列。然后在 按钮单击事件处理程序,您将为两者添加新行

Private Sub Button1_Click_1(sender As Object, e As EventArgs) Handles addbox.Click
    RequisitionDataGridView.Rows.Add(new object[] {value1, value2, value2 })
    IssuanceDataGridView.Rows.Add(new object[] {value6, value7})
End Sub

如果你走得更远,你可以使用DataSource属性。
创建一个代表一行数据的类

Public Class Requisition
    Public Property ItemNo As Integer
    Public Property Unit As String
    Public ItemDescription As String
    Public Quantity As Decimal
End Class

然后创建一个BindingList(Of Requsition)并将其作为数据源添加到DataGridiView中

Public Class YourForm Inherits Form
    Private _requsitionData As New BindingList(Of Requsition)
    Private _issuanceData As New BindingList(Of Issuance) 

    Public Sub New()
        InitializeComponents()

        RequisitionDataGridView.DataSource = _requsitionData
        IssuanceDataGridView.DataSource = _issuanceData
    End Sub

    Private Sub Button1_Click_1(sender As Object, e As EventArgs) Handles addbox.Click
        _requsitionData.Add(new Requisition())
        _issuanceData.Add(new Issuance())
    End Sub       

End Class

【讨论】:

  • 感谢您的想法,但有没有办法将 DataGridView 连接到 ms 文档模板?我实际上在做的是应该通过使用书签将文本框上的值复制到 ms 文档。
  • 您可以使用DataGridViewCell.Tag 保存一些关于书签的信息。如果你能展示你的代码你是如何“连接”的?
  • 这就是我将文本框连接到 ms 文档的方式,oDoc.Bookmarks.Item("bookmarkhere").Range.Text = textbox1.text
  • “bookmarkhere”有什么价值?我的意思是连接“bookmarkhere”和textbox1的逻辑是什么
  • 是这样的,“bookmarkhere”在 ms 文档模板上声明,因此无论 textbox1 中的值如何,都将放置在 ms 文档模板中“bookmarkhere”所在的位置
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-03
  • 2014-01-04
  • 1970-01-01
  • 2020-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多