本文主要是介绍FlexGrid中添加Windows控件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
FlexGrid中添加Windows控件
在FlexGrid的使用过程中,遇到在列中显示按钮的要求,利用 HostedControl 实现。
本例添加一列按钮,其他控件同理。
1. 新规作成一Form,加入FlexGrid控件,将Dock属性设置为 Fill。
2. 追加HostedControl类。
3. 在Form的Load事件中,添加所需要控件。
完整代码如下
Imports C1.Win.C1FlexGrid
Public Class FlexGrid Class FlexGrid
Private _al As ArrayList = New ArrayList()
Private Sub FlexGrid_Load()Sub FlexGrid_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
For i As Integer = 1 To 10
' ボタンを定義する
Dim btn1 As Button = New Button()
btn1.BackColor = SystemColors.Control
'ボタン名を設定する(行番号)
btn1.Name = i.ToString
btn1.Text = "BTN " + i.ToString
'HostedControlを追加する
_al.Add(New HostedControl(C1FlexGrid1, btn1, i, 1))
' 行高さを設定する
C1FlexGrid1.Rows(i).Height = 20
'事件を追加する
AddHandler btn1.Click, AddressOf FlexGridButton_Click
Next
End Sub
Private Sub C1FlexGrid1_Paint()Sub C1FlexGrid1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles C1FlexGrid1.Paint
For Each hosted As HostedControl In _al
hosted.UpdatePosition()
Next hosted
End Sub
Private Sub FlexGridButton_Click()Sub FlexGridButton_Click(ByVal sender As Object, ByVal e As System.EventArgs)
MessageBox.Show("行番号は【" & CType(sender, Button).Name & "】です!")
End Sub
End Class
Friend Class HostedControl Class HostedControl
Friend _flex As C1FlexGrid
Friend _ctl As Control
Friend _row As Row
Friend _col As Column
Friend Sub New()Sub New(ByVal flex As C1FlexGrid, ByVal hosted As Control, ByVal row As Integer, ByVal col As Integer)
_flex = flex
_ctl = hosted
_row = flex.Rows(row)
_col = flex.Cols(col)
' ホストされたコントロールをグリッドに追加します。
_flex.Controls.Add(_ctl)
End Sub
Friend Function UpdatePosition()Function UpdatePosition() As Boolean
' 行および列のインデックスを取得します。
Dim r As Integer = _row.Index
Dim c As Integer = _col.Index
If r < 0 OrElse c < 0 Then
Return False
End If
' セルの位置を取得します
Dim rc As Rectangle = _flex.GetCellRect(r, c, False)
' セルに収まらない場合コントロールを非表示します。
If rc.Width <= 0 OrElse rc.Height <= 0 OrElse (Not rc.IntersectsWith(_flex.ClientRectangle)) Then
_ctl.Visible = False
Return True
End If
' コントロールを表示します。
_ctl.Bounds = rc
_ctl.Visible = True
Return True
End Function
End Class
Public Class FlexGrid Class FlexGrid
Private _al As ArrayList = New ArrayList()
Private Sub FlexGrid_Load()Sub FlexGrid_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
For i As Integer = 1 To 10
' ボタンを定義する
Dim btn1 As Button = New Button()
btn1.BackColor = SystemColors.Control
'ボタン名を設定する(行番号)
btn1.Name = i.ToString
btn1.Text = "BTN " + i.ToString
'HostedControlを追加する
_al.Add(New HostedControl(C1FlexGrid1, btn1, i, 1))
' 行高さを設定する
C1FlexGrid1.Rows(i).Height = 20
'事件を追加する
AddHandler btn1.Click, AddressOf FlexGridButton_Click
Next
End Sub
Private Sub C1FlexGrid1_Paint()Sub C1FlexGrid1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles C1FlexGrid1.Paint
For Each hosted As HostedControl In _al
hosted.UpdatePosition()
Next hosted
End Sub
Private Sub FlexGridButton_Click()Sub FlexGridButton_Click(ByVal sender As Object, ByVal e As System.EventArgs)
MessageBox.Show("行番号は【" & CType(sender, Button).Name & "】です!")
End Sub
End Class
Friend Class HostedControl Class HostedControl
Friend _flex As C1FlexGrid
Friend _ctl As Control
Friend _row As Row
Friend _col As Column
Friend Sub New()Sub New(ByVal flex As C1FlexGrid, ByVal hosted As Control, ByVal row As Integer, ByVal col As Integer)
_flex = flex
_ctl = hosted
_row = flex.Rows(row)
_col = flex.Cols(col)
' ホストされたコントロールをグリッドに追加します。
_flex.Controls.Add(_ctl)
End Sub
Friend Function UpdatePosition()Function UpdatePosition() As Boolean
' 行および列のインデックスを取得します。
Dim r As Integer = _row.Index
Dim c As Integer = _col.Index
If r < 0 OrElse c < 0 Then
Return False
End If
' セルの位置を取得します
Dim rc As Rectangle = _flex.GetCellRect(r, c, False)
' セルに収まらない場合コントロールを非表示します。
If rc.Width <= 0 OrElse rc.Height <= 0 OrElse (Not rc.IntersectsWith(_flex.ClientRectangle)) Then
_ctl.Visible = False
Return True
End If
' コントロールを表示します。
_ctl.Bounds = rc
_ctl.Visible = True
Return True
End Function
End Class
执行结果如下
这篇关于FlexGrid中添加Windows控件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!