Я создал UserControl и добавил его в FlowLayoutPanel
. UserControl используется, чтобы позволить пользователю вводить в форму материал, стоимость и доставку. Когда пользователь заполнил его, я хочу другой UserControl появляться под ним в FlowLayoutPanel
Динамическое добавление пользовательского элемента управления к FlowLayoutPanel
UserControl просто генерирует строку на основе введенного текста в два TextBox
управления и состояние двух Checkbox
управления. он также имеет свойство, которое указывает, когда пользователь заполнил достаточную информацию. Я хочу использовать это свойство для генерации нового UserControl.
На данный момент у меня есть мой первый UserControl на FlowLayoutPanel
, он успешно передает свойство String и CreateNew
.
Проблемы я сталкивающиеся являются:
- Как следить, чтобы увидеть, если
CreateNew
изменился Верно? - Как добавить элемент управления в форме и +1 к имени элементов управления для будущего ссылающегося
- После того, как новый элемент управления добавляется, мне нужно следить, чтобы увидеть, если новые
CreateNew
изменения состояния, чтобы повторить цикл
Может ли кто-нибудь указать мне в правильном направлении, здесь есть много информации, но я не могу найти ничего полезного из других проблем/вопросов других.
UPDATE 1
Благодаря пользовательским Zaggler для комментария, я сейчас удалось получить контроль, чтобы создать новый экземпляр себе на FlowLayoutPanel
. Но теперь я столкнулся с новой проблемой, связанной с созданием только одного нового пользовательского контроля, а затем он останавливается.
Вот код, я использую:
UserControl Код
Public Class Alv_Product_Order_Control
Public OutString As String
Public Event CreateNew()
Dim CreateNewRaised As Boolean
Private Sub OutputString(sender As Object, e As EventArgs) Handles tbMaterial.TextChanged, tbCost.TextChanged,
cbDelivered.CheckedChanged, cbOrderPlaced.CheckedChanged
OutString = "¦¦" & tbMaterial.Text & "¦" & tbCost.Text & "¦"
If cbOrderPlaced.Checked = True Then
OutString = OutString & "Yes¦"
Else
OutString = OutString & "No¦"
End If
If cbDelivered.Checked = True Then
OutString = OutString & "Yes¦"
Else
OutString = OutString & "No¦"
End If
If tbCost.Text = "" Or tbMaterial.Text = "" Then
Else
If CreateNewRaised = False Then
RaiseEvent CreateNew() 'Raise the event that's used to signal adding a new control to the layout
CreateNewRaised = True 'Create A Latched Boolean that cannot change again in the future
End If
End If
End Sub
Public ReadOnly Property Alv_Product_Order_Control As String
Get
Return OutString 'Pass string back to main form
End Get
End Property
Главная форма Код
Private Sub CreateSecondPOC() Handles POC1.CreateNew
FlowLayoutPanel1.Controls.Add(New Alveare_VB.Alv_Product_Order_Control)
End Sub
Я здесь предполагаю, что проблема заключается в CreateSecondPOC
обрабатывает событие только для первого POC1
Как создать новый Alveare_VB.Alv_Product_Order_Control
, назовите его как POC2, а также добавьте обработчик для обработки POC2.CreateNew
и добавьте еще один элемент управления?
Edit 2
Я знаю, что я нашел ответ, но я хотел бы посмотреть на эту утечку памяти, которая была упомянута.Я изменил код, поставляемый в ответ ниже этой:
Private Sub CreateSecondPOC(ByVal sender As Object, ByVal e As System.EventArgs) Handles POC1.CreateNew
Try
Dim oldPoc = DirectCast(sender, Alveare_VB.Alv_Product_Order_Control)
RemoveHandler oldPoc.CreateNew, AddressOf CreateSecondPOC
Catch ex As Exception
Debug.Print(ex.Message)
End Try
Dim newPoc As New Alveare_VB.Alv_Product_Order_Control
AddHandler newPoc.CreateNew, AddressOf CreateSecondPOC
FlowLayoutPanel1.Controls.Add(newPoc)
End Sub
И я получаю следующее сообщение об ошибке в строке «RemoveHandler»:
Не удалось привести объект типа «System.Windows .Forms.TextBox 'для ввода' Alveare_VB.Alv_Product_Order_Control '.
Событие CreateNew
возникает, когда написано текстовое поле, которое передается обратно в качестве отправителя, которого я предполагаю? Не совсем уверен, куда идти с этим сейчас.
Редактировать 3
Ошибка была в моей UserControl
, я отправлял неправильный объект назад (в этом случае текстовое поле). Теперь я изменил RaiseEvent
, чтобы вернуть UserControl
в качестве объекта. Теперь все работает правильно.
Создайте событие и поднимите его, когда вам нужно. Посмотрите на 'withevents' ... – Codexer
@ Zaggler Спасибо за руководство, я сделал некоторый прогресс, см. Обновленный вопрос – SilverShotBee
. Добро пожаловать, пожалуйста, см. Комментарий под Verdolino ответ вы приняли. – Codexer