2015-06-22 22 views
1

在VB.NET,我希望建立一個「時代」網格非常類似於Windows的父母節的時間限制格:http://www.thinkbroadband.com/images/guides/time-restrictions.png建議時間網格?

它需要2種顏色的切換單元單擊

我已經玩過One-Cell = One-Label,它有點不錯,但是和Windows時間限制網格一樣,如果我移動標籤有左按鈕,我希望標籤更改顏色按下(不僅在標籤上點擊)。

這是我目前有:

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事件。您可以將網格綁定到您自己的類或數據表。點擊事件可用。 – rheitzman

+0

@rheitzman你會有這樣的解決方案的例子嗎? – jplanglais

回答

1

當你點擊一個控制和你按住鼠標按鈕,在移動鼠標時,這種控制捕獲以下鼠標事件,這樣你就不會從其他標貼獲取事件他們。

訣竅是設置label.Capture = False

允許定義顏色:

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

和布爾值存儲我們的操作的當前狀態

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

(全4的窗體類的字段)

現在讓我們寫這三事件處理程序:

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 

這就是它!


腳註:我創建了標貼這樣的:

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

hehe我是36yo所以不是,不是作業;)感謝提示,非常有用,讓我在正確的方向。數據網格的問題是,當選擇橫向時,它可以工作,但是橫向和虛擬(基本對角),網格創建一個「矩形」選擇。我需要只有選中的單元「懸停」.. – jplanglais

+0

dgv有一個懸停事件,但IMO不會對用戶友好 - 很難編碼。嘗試使用上面的拖動版本(刪除CellClick事件。)在這種情況下,「拖動」是鼠標向下並在向上鼠標時切換所選單元格。切換一個單元格「點擊」鼠標向下/向上。 – rheitzman