Vinod Kc Ответов: 2

Как я могу удалить метку с панели on и добавить ее на другую панель во время выполнения ?


Всем привет,
У меня есть 11 панелей и 15 этикеток в моей форме. Одна панель-это MasterContainer, и она содержит все 15 меток. Остальные 10 панелей готовы содержать эти метки. Пользователь может выбрать любую панель из этих 10 панелей, щелкнув ее левой кнопкой мыши. И он может дважды щелкнуть по каждой метке. Затем дважды щелкнутая метка должна перейти на выбранную панель. Это мой псевдокод.
- Событие двойного щелчка ярлыка
1. Удалите нажатую метку из MainContainer.
2. Добавьте его в выбранную панель.
3. Исправить новые точки расположения этот ярлык помещается на выбранную панель.

Но я не могу сделать третий шаг, потому что он не даст никаких результатов. В конце концов, если я пишу код для новых местоположений, то перемещенная метка исчезает. Но если не писать код для изменения местоположения, то несколько меток появятся на новой панели. Но не все нажали ярлыки. Я использую оператор Select Case для назначения местоположений для перемещенных меток.
То есть

Dim No_Of_Labels_In_Panel As Integer = SelectedPanel.Controls.Count
Select Case No_Of_Labels_In_Panel
	Case 0
		' assign location for first label
	Case 1
		' assign location for the second panel
	Case 3
		' Shrink other labels and make room for third label.


И так далее.
Панель может содержать до 7 меток.

Что я уже пробовал:

Private Sub SelectedLabel_MouseDoubleClick(sender As Object, e As MouseEventArgs) 
        SelectedLabel = DirectCast(sender, Label)
        MainContainer.Controls.Remove(SelectedLabel)
        Dim NewLoc As Point
        No_Of_Cntrls_In_Panel = SelectedPanel.Controls.Count
        Select Case No_Of_Cntrls_In_Panel

            Case 0
                NewLoc = New Point(Me.SelectedPanel.Bounds.X + 5, Me.SelectedPanel.Bounds.Y + 5)
            Case 1
                NewLoc = New Point(Me.SelectedPanel.Bounds.X + 50, Me.SelectedPanel.Bounds.Y + 5)
            Case 2
                NewLoc = New Point(Me.SelectedPanel.Bounds.X + 5, Me.SelectedPanel.Bounds.Y + 50)
        End Select
        With SelectedLabel
            .Size = New Size(30, 30)
            .Location = NewLoc
        End With
        
        SelectedPanel.Controls.Add(SelectedLabel)
        SelectedPanel.SendToBack()
        SelectedLabel.BringToFront()
        Me.Refresh()
       
    End Sub

2 Ответов

Рейтинг:
1

OriginalGriff

Начните с упрощения вещей и попытайтесь увидеть, что именно происходит:

Private Sub SelectedLabel_MouseDoubleClick(sender As Object, e As MouseEventArgs) 
    SelectedLabel = DirectCast(sender, Label)
    MainContainer.Controls.Remove(SelectedLabel)
    SelectedPanel.Controls.Add(SelectedLabel)
End Sub
Теперь, когда вы дважды щелкнете по метке, она будет удалена с главной панели и перемещена на другую.
Быстрый тест должен доказать, что это работает.
Если это так, то проблема заключается в остальной части вашего кода, и почти наверняка местоположение не видно, или размер означает, что вы не можете видеть метку. Без вашего другого кода мы не можем сказать-так что верните бит размера обратно:
Private Sub SelectedLabel_MouseDoubleClick(sender As Object, e As MouseEventArgs) 
    SelectedLabel = DirectCast(sender, Label)
    MainContainer.Controls.Remove(SelectedLabel)
    SelectedLabel.Size = New Size(30, 30)
    SelectedPanel.Controls.Add(SelectedLabel)
End Sub
И посмотрим, что будет дальше. Продолжайте делать это, и станет ясно, в чем проблема.


Привет OriginalGriff,
Спасибо за быстрый ответ. Но это работает не так, как я себе представляю. Я признаю, что мне нужно изменить размер шрифта, чтобы уменьшить метку, чтобы пользователь мог прочитать текст метки. Теперь, согласно вашему предложению, мы не говорим этой программе поместить этикетку в определенное место. Таким образом, некоторые метки отображаются внутри панели. Но некоторые-нет. И самое странное, что метки появляются на панели точно так же, как они появляются в MainContainer. На одинаковом расстоянии друг от друга и в том же порядке.


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


Привет,
Поскольку я сам учусь, я еще никогда не использовал точку останова. Потому что я не видел никакого учебника о том, как его использовать. Вместо этого я использую отладку.Команда WriteLine, чтобы увидеть, что там происходит. В этом контексте я собираюсь сделать то же самое в контрольном событии панели. Если я делаю что-то не так или есть какой-то шанс улучшить свой метод отладки, пожалуйста, поправьте меня.


Это одна из причин, почему быть "самообучающимся" - очень плохая идея - вы никогда не знаете, чего вам не хватает, потому что вы даже не знаете, что это существует! Возьмите книгу - или лучше пройдите курс-и проследите его до конца. Он должен представлять все в хорошо структурированном виде, чтобы вы не пропустили важные вещи.

Отладчик похож на использование Debug.WriteLine-только лучше, и без необходимости добавлять какие-либо утверждения. Начните с вашего метода, отображаемого в Visual Studio, и поместите курсор на первую строку. Перейдите в меню и выберите пункт "Отладка...Переключить точку останова "- в левой части линии появится красная точка - это" индикатор точки останова", и если вы нажмете на нее, она исчезнет. Нажмите еще раз, и он вернется. Теперь вы знаете, куда идет точка, это самый быстрый способ переключить точку останова: нажмите на этот столбец, и эта строка получит точку останова.
Теперь запустите код в отладчике-обычно это просто нажатие клавиши F5, но меню скажет вам: "отладка...Start Debugging " сделает это и сообщит вам, какой ключ ему назначен.
Когда ваше приложение достигнет точки останова, оно остановится и передаст управление вам. Вы можете просмотреть содержимое переменных, наведя на них курсор мыши, или использовать панели "Auto", "Locals" и "Watch" области вывода на экране VS. И вы можете один шаг Вы код-это означает, что вы можете выполнить его строка за строкой, чтобы увидеть точно, что происходит и почему он делает то, что он сделал. Не только это, но вы можете изменить код во время работы вашего приложения, чтобы увидеть, устраняет ли это проблему!

Он мощный, очень мощный - но это основа, и его должно хватить на очень долгое время (я вообще почти не использую более продвинутые функции!)
Попробуйте-и вы скоро удивитесь, что, черт возьми, вы делали без него! :смеяться:


Vinod Kc

Привет, когда я писал код для изменения местоположения, я не видел никаких меток на SelectedPanel. Метки, получающие событие двойного щелчка, исчезают из MainContainer, но не появляются в SelectedPanel. Если я закомментирую эту строку кода(код изменения местоположения), метки появятся в SelectedPanel, но они сохранят пробел, который мне не нравится.

OriginalGriff

Поэтому следующее, что нужно сделать, - это точно выяснить, куда он их помещает.
Если вы поставите точку останова в строке" Location = NewLoc", то в какую точку она будет установлена?

Vinod Kc

Привет,
Поскольку я сам учусь, я еще никогда не использовал точку останова. Потому что я не видел никакого учебника о том, как его использовать. Вместо этого я использую отладку.Команда WriteLine, чтобы увидеть, что там происходит. В этом контексте я собираюсь сделать то же самое в контрольном событии панели. Если я делаю что-то не так или есть какой-то шанс улучшить свой метод отладки, пожалуйста, поправьте меня.

OriginalGriff

Ответ обновлен

Рейтинг:
0

Vinod Kc

Привет,
Спасибо за помощь. Я никогда раньше не читал такие вещи. На самом деле, я никогда не предполагал, что такие вещи действительно существуют. Как самоучка, я в основном полагаюсь на книги. Но я не могу найти книгу, которая рассказывала бы нам об этом. В каждой книге, которую я читал, говорилось, что нужно написать свой код и запустить. Так я и сделал. И когда мне нужно выяснить, что происходит между началом и окончанием программы, я полагаюсь на Debug.WriteLine. И я доволен этим, поскольку он написал то, что я хочу знать, в консоль вывода. Я думаю, что пропустил это, когда изучал основы. В то время я не был заядлым читателем. Спасибо за советы. Теперь перейдем к делу. Я добавил точку останова на строке смены местоположения. Эта часть кода работает отлично. Как я себе представляю, он перемещает метку в нужные места. Но ярлыки скрываются. Во всяком случае, теперь я решил, что узнаю больше об отладке.