2015-06-22 2 views
1

В VB.NET Я ищу построить «Time» сетку, очень похожую на Restriction сетке времени родительской секции Windows: http://www.thinkbroadband.com/images/guides/time-restrictions.pngПредложение по временной сетке?

Это необходимо для переключения между 2-х цветов на ячейку щелкните

Я играл с One-Cell = One-Label, и это работает, но, как и сетка Windows Time Restriction, я бы хотел, чтобы метки меняли цвета, если я перехожу по метке , пока с левой кнопкой нажата (и не только на этикетке).

Вот что я в настоящее время:

Private Sub ColorToggle(sender As Object, e As MouseEventArgs) Handles Label1.Click, Label2.Click, Label3.Click 'etc.. 
    If e.Button = Windows.Forms.MouseButtons.Left Then 
     sender.backcolor = If(sender.backcolor = SystemColors.Control, Color.LightGreen, SystemColors.Control) 
    End If 
End Sub 

Поскольку отправитель остается такой же, когда я парить метки (отправитель = метка я изначально нажал на), этот код не работает для моей цели ,

Я ищу предложения!

Спасибо :)

+0

Несвязанный элемент управления datagridview может сделать трюк. Все ячейки адресуются. Вы можете обращаться к ячейкам при загрузке, чтобы изменить цвет, или вы можете использовать событие cellformat. Вы можете привязать сетку к собственному классу или к datatable. Доступны события Click. – rheitzman

+0

@rheitzman Если у вас есть пример такого решения? – jplanglais

ответ

1

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

Хитрость заключается в установке label.Capture = False.

Позволяет определить цвета:

Private ReadOnly selectedColor As Color = Color.Blue 
Private ReadOnly unselectedColor As Color = Color.White 

И Booleans сохранения текущего состояния наших операций

Private isSelecting As Boolean = False 
Private isUnselecting As Boolean = False 

(Все четыре, как поля класса формы)

Теперь давайте писать эти три обработчики событий:

Private Sub Label_MouseDown(sender As Object, e As EventArgs) 
    'This event starts selecting/unselecting 

    Dim label = DirectCast(sender, Label) 
    label.Capture = False '<=== THIS IS IMPORTANT! 
    If label.BackColor = selectedColor Then 
     isUnselecting = True 
    Else 
     isSelecting = True 
    End If 
    SelectLabel(label) 
End Sub 

Private Sub Label_MouseUp(sender As Object, e As EventArgs) 
    'This event stops selecting/unselecting 

    isSelecting = False 
    isUnselecting = False 
End Sub 

Private Sub Label_MouseEnter(sender As Object, e As EventArgs) 
    SelectLabel(DirectCast(sender, Label)) 
End Sub 

И нам нужна эта процедура, которая выбирает или отменялся метки:

Private Sub SelectLabel(label As Label) 
    If isSelecting Then 
     label.BackColor = selectedColor 
    ElseIf isUnselecting Then 
     label.BackColor = unselectedColor 
    End If 
End Sub 

Вот оно!


Сноска: Я создал Lables так:

Private Sub Form_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    Const w As Integer = 50, h As Integer = 50 

    For x = 1 To 10 
     For y = 1 To 10 
      Dim lbl As New Label() With { 
       .Location = New Point(x * w, y * h), 
       .Size = New Size(w, h), 
       .BorderStyle = BorderStyle.FixedSingle, 
       .BackColor = unselectedColor 
      } 
      AddHandler lbl.MouseDown, AddressOf Label_MouseDown 
      AddHandler lbl.MouseUp, AddressOf Label_MouseUp 
      AddHandler lbl.MouseEnter, AddressOf Label_MouseEnter 
      Controls.Add(lbl) 
     Next 
    Next 
End Sub 
+0

Привет, спасибо за хорошее предложение, мой макет имеет 4 строки из 94 ярлыков (в основном одна метка = 15 минут), и есть 4 дня.Я реализовал вашу почву, но кажется, что она медленная, и некоторые метки не выделяются, когда мышь перемещается (даже медленно). Чтобы заставить его работать, мне нужно двигаться ОЧЕНЬ ОЧЕНЬ медленно. Любой вопрос о том, как повысить производительность? – jplanglais

+0

Моя тестовая реализация выполняется очень быстро. Возможно, что-то еще замедляет его. Попробуйте реализовать мое решение в новой пустой форме. Не размещайте на нем никаких элементов управления и используйте код, который я показал в своей сноске, чтобы заполнить его. Адаптируйте числа, чтобы получить этикетки 94 x 4. Также как тест. –

+1

Я тестировал RDP, поэтому он был медленным. Тестирование на местах отлично работает. Принимая решение. – jplanglais

1

Я надеюсь, что это не домашнее задание ...

Private Sub Button8_Click(sender As Object, e As EventArgs) Handles Button8.Click 
    Dim i As Integer 
    With dgv 
     .ColumnCount = 0 
     .DataSource = Nothing 
     .Columns.Add("Day", "Day") 
     For i = 0 To 23 
      .Columns.Add(i, i) 
      .Columns(.Columns.Count - 1).Width = 30 
     Next 
     For i = 1 To 7 
      .Rows.Add({i}) 
     Next 

    End With 
End Sub 

Private Sub dgv_CellClick(sender As Object, e As DataGridViewCellEventArgs) Handles dgv.CellClick 
    dgv.CurrentCell.Style.BackColor = Color.Blue 
End Sub 

Вот перетаскивание версия:

Private Sub dgv_MouseUp(sender As Object, e As MouseEventArgs) Handles dgv.MouseUp 
    For Each cell As DataGridViewCell In dgv.SelectedCells 
     If cell.Style.BackColor = Color.Blue Then 
      cell.Style.BackColor = Color.White 
     Else 
      cell.Style.BackColor = Color.Blue 
     End If 
    Next 
    dgv.ClearSelection() 
End Sub 
+0

.Rows.Add ({Формат (CDate ("1 /" & i & "/ 1990"), "dddd")}) для названий дней – rheitzman

+0

Хе-хе, мне 36лет, нет, не для домашней работы;) Спасибо за советы, очень полезно поставить меня в правильном направлении. Проблема с datagrid заключается в том, что при выборе горизонтали он работает, но горизонтально И верительно (по диагонали в основном) сетка создает «прямоугольник». Мне нужно, чтобы только ячейки «зависали» были выбраны. – jplanglais

+0

У dgv есть событие Hover, но IMO это не было бы дружественным к пользователю - сложным для кода. Попробуйте перетащить версию выше (удалите событие CellClick.) «Перетащить» в этом случае будет левая кнопка мыши и по мыши вверх, чтобы выбранные ячейки были переключены. Переключить одну ячейку «нажмите» для мыши вниз/вверх. – rheitzman

Смежные вопросы