Есть ли способ связать метку и поле даты при динамическом добавлении в форму vb.net - PullRequest
0 голосов
/ 13 января 2020

Я не уверен, возможно ли то, что я делаю, и если да, то какой лучший способ сделать это go. У меня есть WinForm, динамически создающая элементы управления, в зависимости от типа, предварительно выбранного пользователем. Это включает в себя текстовые поля, поля даты, выпадающие и другие. Когда поле даты создано, я хочу добавить метку, которая отображает возраст рядом с ним. Имея то, что у меня есть сейчас, я могу отобразить возраст, когда форма загружается, но мне нужно решение о том, как получить метку для обновления, если дата изменилась? Я попытался создать обработчик отпуска для средства выбора даты, но это не работает, поскольку он не контролирует каждый элемент управления средства выбора даты, а только последний созданный.

РЕДАКТИРОВАТЬ: Я собираюсь поделиться некоторым кодом, который я использую сейчас. Эта функция вычисляет возраст и создает метку, которая будет go рядом с указателем даты.

Private Sub getAge()
    If ucDP.Text = "" OrElse ucDP.Text = "  /  /" Then
        Exit Sub
    End If
    Dim currentDate As DateTime = DateTime.Now
    Dim zeroTime As DateTime = New DateTime(1, 1, 1)
    Dim selectedDate As DateTime = New DateTime(Convert.ToDateTime(ucDP.Text).Year, Convert.ToDateTime(ucDP.Text).Month, Convert.ToDateTime(ucDP.Text).Day)
    Dim dateNow As DateTime = New DateTime(currentDate.Year, currentDate.Month, currentDate.Day)
    lblAge = New Label
    If (selectedDate > dateNow) Then
        Exit Sub
    End If
    Dim span As TimeSpan = dateNow - selectedDate
    Dim years As Integer = ((zeroTime + span).Year - 1)
    lblAge.Text = "Age: " & years
    lblAge.Location = New Drawing.Point(ucDP.Location.X + 122, ucDP.Location.Y + 2)
    lblAge.ForeColor = System.Drawing.Color.MidnightBlue
    lblAge.Font = New System.Drawing.Font("Segoe UI", 9.75!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))

    gb.Controls.Add(lblAge)

End Sub

И у меня просто подпрограмма, выполняющаяся в обработчике событий ucDP.

РЕДАКТИРОВАТЬ 2: Добавление, как я создаю элемент управления datepicker

ElseIf datatype = "date" Then
            ucDP = New MSCtrlCore.ucDatePicker()
            ucDP.FutureDateEnabled = True
            ucDP.Name = "ucdp" & pkIOCI
            ucDP.Location = New Drawing.Point((gb.Width / 2) + 80, lbl.Location.Y + 3)
            ucDP.Format = "MM/DD/YYYY"
            ucDP.Size = New Drawing.Size(120, 26)
            ucDP.Anchor = AnchorStyles.Top Or AnchorStyles.Left Or AnchorStyles.Right

            sql = String.Format("SELECT Answer FROM OtherCoverageAnswers WHERE ISNULL(IsArchived, 0) = 0 AND fk_InsuredOtherCoverageInfo = {0} AND fk_Insured = {1}", pkIOCI, insuredKey)
            Try
                GetScalar(sql, strValue)
                If strValue = String.Empty OrElse strValue = "0" Then
                    ucDP.Text = ""
                Else
                    ucDP.Text = strValue
                End If
            Catch ex As System.Exception
            End Try
            AddHandler ucDP.Leave, AddressOf ucDP_Leave
            gb.Controls.Add(ucDP)

Ответы [ 2 ]

1 голос
/ 14 января 2020

Слушай хорошо, потому что я слишком много времени уделяю этому ответу. Хорошо, я люблю это, но все же, пожалуйста, не тратьте мое время и изучите хотя бы одну вещь, даже если это не тот ответ, который вы ищете.

Мы сделаем то, что сказал Джими, и создадим пользовательский элемент управления, который будет хранить операционный лог c все в одном месте.

Сначала щелкните правой кнопкой мыши свой проект и добавьте новый пользовательский элемент управления:

Right click here

Add a new user control

Назовите его как хотите. Я называю мое AgeDateTimePickerControl:

Create a new user control

Теперь создайте свой новый элемент управления. Это так же просто, как создать форму:

Design the user control

Вы можете кодировать свойства, события и подобные вещи в свой пользовательский элемент управления. Я приучил свою, скопировав логин вычислений вашего возраста c (я изменил его на более простой, потому что это всего лишь пример) и записав его в событие ValueChanged DateTimePicker. Я также кодировал 2 свойства: возраст (только для чтения) и дату рождения (для чтения и записи). Я сделал свойства так, чтобы позже, когда я использовал элемент управления внутри формы, я мог легко получить к ним доступ.

Вот как выглядит код:

Public Class AgeDateTimePickerControl
    Private _age As Integer

    'You can create properties for your custom control to access them from your form later
    Public ReadOnly Property Age() As String
        Get
            Return _age
        End Get
    End Property

    Public Property BirthDate() As DateTime
        Get
            Return DateTimePicker1.Value
        End Get
        Set(value As DateTime)
            DateTimePicker1.Value = value
        End Set
    End Property

    'You can use events just like in a form
    Private Sub DateTimePicker1_ValueChanged(sender As Object, e As EventArgs) Handles DateTimePicker1.ValueChanged
        If (DateTimePicker1.Value < Date.Today) Then
            _age = Date.Today.Year - DateTimePicker1.Value.Year
            Label1.Text = "Age: " & _age
        End If
    End Sub
End Class

Один раз вы закончили работу с новым инструментом, сохраните свой проект и перестройте его (если вы не создадите свой собственный элемент управления, Visual Studio не позволит использовать его в конструкторе форм).

REBUILD

Теперь вы можете перетащить его из панели инструментов. Какая? Вы хотите добавить это программно? Конечно, вы также можете сделать это. Но сначала посмотрите на панель инструментов! Вы только что создали новый элемент управления!

enter image description here

Теперь, чтобы проверить бизнес-логику c вашего нового элемента управления, перетащите его в форму , скомпилируйте и попробуйте. Тот, который я только что написал, был забавным, но, возможно, не совсем тем, что вы хотите, так что настройте и кодируйте, пока не будете удовлетворены.

Затем добавьте его программно в форму, как вы привыкли делать с элементами управления, которые использовали раньше.

Разве жизнь не прекрасна?

0 голосов
/ 14 января 2020

Вы можете отслеживать метки, добавленные в список. Затем, когда значение DateTimePicker изменяется, вы можете обновить текст каждой метки. Это позволяет использовать несколько меток.

Private ageLabels As New List(Of Label)()

Private Sub getAge()
    If ucDP.Text = "" OrElse ucDP.Text = "  /  /" Then
        Exit Sub
    End If
    Dim currentDate As DateTime = DateTime.Now
    Dim zeroTime As DateTime = New DateTime(1, 1, 1)
    Dim selectedDate As DateTime = New DateTime(Convert.ToDateTime(ucDP.Text).Year, Convert.ToDateTime(ucDP.Text).Month, Convert.ToDateTime(ucDP.Text).Day)
    Dim dateNow As DateTime = New DateTime(currentDate.Year, currentDate.Month, currentDate.Day)
    lblAge = New Label
    If (selectedDate > dateNow) Then
        Exit Sub
    End If
    Dim span As TimeSpan = dateNow - selectedDate
    Dim years As Integer = ((zeroTime + span).Year - 1)
    lblAge.Text = "Age: " & years
    lblAge.Location = New Drawing.Point(ucDP.Location.X + 122, ucDP.Location.Y + 2)
    lblAge.ForeColor = System.Drawing.Color.MidnightBlue
    lblAge.Font = New System.Drawing.Font("Segoe UI", 9.75!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))

    gb.Controls.Add(lblAge)
    ageLabels.Add(l)

End Sub

Private Sub DateTimePicker1_ValueChanged(sender As Object, e As EventArgs) Handles DateTimePicker1.ValueChanged
    ageLabels.ForEach(Sub(l) l.Text = $"{DateTimePicker1.Value}")
    ' fix logic to show age instead of date :)
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...