Henry手记:WinForm Datagrid结构剖析(三)类代码

本文展示了DataGridComboBox和DataGridComboBoxColumn类的代码实现。定义了在下拉框列类中使用的ComboBox,包含不同类型参数的构造函数,还实现了从DataGridColumnStyle类继承下来的多个方法,如Abort、Commit、Edit等,代码未完待续。

-------------------X类的代码X---------------------

Option Strict On

Option Explicit On

Imports System.Collections

Imports System.ComponentModel

Imports System.Drawing

Imports System.Windows.Forms

Imports System.Data

 

Public Class DataGridComboBox 

‘与DataGridTextBox类相类似地定义一个在下拉框列类中使用的ComboBox

    Inherits ComboBox

    Public Sub New()

        MyBase.New()

    End Sub

    Public isInEditOrNavigateMode As Boolean = True

End Class

 

Public Class DataGridComboBoxColumn

    Inherits DataGridColumnStyle

     ' 与用户界面相关的变量   

     Private xMargin As Integer = 2

    Private yMargin As Integer = 1

    Private Combo As DataGridComboBox

    Private _DisplayMember As String

    Private _ValueMember As String

    ' 用于跟踪编辑状态变化的变量

    Private OldVal As String = String.Empty

    Private InEdit As Boolean = False

    '构造函数 – 实例的DisplayMember, ValueMember值为由父类传来的integer类型的值

    Public Sub New(ByRef DataSource As DataTable, _

                   ByVal DisplayMember As Integer, _

                   ByVal ValueMember As Integer)

        Combo = New DataGridComboBox()

        _DisplayMember = DataSource.Columns.Item(index:=DisplayMember).ToString

        _ValueMember = DataSource.Columns.Item(index:=ValueMember).ToString

        With Combo

            .Visible = False

            .DataSource = DataSource

            .DisplayMember = _DisplayMember

            .ValueMember = _ValueMember

        End With

    End Sub

    '构造函数– 实例的DisplayMember, ValueMember 是String类型的值

    Public Sub New(ByRef DataSource As DataTable, _

                   ByVal DisplayMember As String, _

                   ByVal ValueMember As String)

        Combo = New DataGridComboBox()

        With Combo

            .Visible = False

            .DataSource = DataSource

            .DisplayMember = DisplayMember

            .ValueMember = ValueMember

        End With

    End Sub

    '------------------------------------------------------

    '从 DataGridColumnStyle类继承下来的方法

    '------------------------------------------------------

    ' 焦点离开combobox格后的改变

    Protected Overloads Overrides Sub Abort(ByVal RowNum As Integer)

        Debug.WriteLine("Abort()")

        RollBack()

        HideComboBox()

        EndEdit()

    End Sub

    ' 接受改变

    Protected Overloads Overrides Function Commit(ByVal DataSource As CurrencyManager, _

                                          ByVal RowNum As Integer) As Boolean

        HideComboBox()

        If Not InEdit Then

            Return True

        End If

        Try

            Dim Value As Object = Combo.SelectedValue

            If NullText.Equals(Value) Then

                Value = Convert.DBNull

            End If

            SetColumnValueAtRow(DataSource, RowNum, Value)

        Catch e As Exception

            RollBack()

            Return False

        End Try

        EndEdit()

        Return True

    End Function

    ' 移开聚焦

    Protected Overloads Overrides Sub ConcedeFocus()

        Combo.Visible = False

    End Sub

    ' 编辑单元格

    Protected Overloads Overrides Sub Edit(ByVal Source As CurrencyManager, _

                                           ByVal Rownum As Integer, _

                                           ByVal Bounds As Rectangle, _

                                           ByVal [ReadOnly] As Boolean, _

                                           ByVal InstantText As String, _

                                           ByVal CellIsVisible As Boolean)

        Combo.Text = String.Empty

        Dim OriginalBounds As Rectangle = Bounds

        OldVal = Combo.Text

        If CellIsVisible Then

            Bounds.Offset(xMargin, yMargin)

            Bounds.Width -= xMargin * 2

            Bounds.Height -= yMargin

            Combo.Bounds = Bounds

            Combo.Visible = True

        Else

            Combo.Bounds = OriginalBounds

            Combo.Visible = False

        End If

        Combo.SelectedValue = GetText(GetColumnValueAtRow(Source, Rownum))

        If Not InstantText Is Nothing Then

            Combo.SelectedValue = InstantText

        End If

        Combo.RightToLeft = Me.DataGridTableStyle.DataGrid.RightToLeft

        Combo.Focus()

        If InstantText Is Nothing Then

            Combo.SelectAll()

        Else

            Dim [End] As Integer = Combo.Text.Length

            Combo.Select([End], 0)

        End If

        If Combo.Visible Then

            DataGridTableStyle.DataGrid.Invalidate(OriginalBounds)

        End If

        InEdit = True

    End Sub

    Protected Overloads Overrides Function GetMinimumHeight() As Integer

        ' 设置combobox的最小高度

        Return Combo.PreferredHeight + yMargin

    End Function

    Protected Overloads Overrides Function GetPreferredHeight(ByVal g As Graphics, _

                                         ByVal Value As Object) As Integer

        Debug.WriteLine("GetPreferredHeight()")

        Dim NewLineIndex As Integer = 0

        Dim NewLines As Integer = 0

        Dim ValueString As String = Me.GetText(Value)

        Do

            While NewLineIndex <> -1

                NewLineIndex = ValueString.IndexOf("r/n", NewLineIndex + 1)

                NewLines += 1

            End While

        Loop

        Return FontHeight * NewLines + yMargin

    End Function

    Protected Overloads Overrides Function GetPreferredSize(ByVal g As Graphics, _

                                                   ByVal Value As Object) As Size

        Dim Extents As Size = Size.Ceiling(g.MeasureString(GetText(Value), _

                                    Me.DataGridTableStyle.DataGrid.Font))

        Extents.Width += xMargin * 2 + DataGridTableGridLineWidth

        Extents.Height += yMargin

        Return Extents

    End Function

    Protected Overloads Overrides Sub Paint(ByVal g As Graphics, _

                                            ByVal Bounds As Rectangle, _

                                            ByVal Source As CurrencyManager, _

                                            ByVal RowNum As Integer)

        Paint(g, Bounds, Source, RowNum, False)

    End Sub

    Protected Overloads Overrides Sub Paint(ByVal g As Graphics, _

                                            ByVal Bounds As Rectangle, _

                                            ByVal Source As CurrencyManager, _

                                            ByVal RowNum As Integer, _

                                            ByVal AlignToRight As Boolean)

        Dim Text As String = GetText(GetColumnValueAtRow(Source, RowNum))

        PaintText(g, Bounds, Text, AlignToRight)

    End Sub

    Protected Overloads Sub Paint(ByVal g As Graphics, _

                                  ByVal Bounds As Rectangle, _

                                  ByVal Source As CurrencyManager, _

                                  ByVal RowNum As Integer, _

                                  ByVal BackBrush As Brush, _

                                  ByVal ForeBrush As Brush, _

                                  ByVal AlignToRight As Boolean)

 

        Dim Text As String = GetText(GetColumnValueAtRow(Source, RowNum))

        PaintText(g, Bounds, Text, BackBrush, ForeBrush, AlignToRight)

    End Sub

    Protected Overloads Overrides Sub SetDataGridInColumn(ByVal Value As DataGrid)

        MyBase.SetDataGridInColumn(Value)

        If Not (Combo.Parent Is Value) Then

            If Not (Combo.Parent Is Nothing) Then

                Combo.Parent.Controls.Remove(Combo)

            End If

        End If

        If Not (Value Is Nothing) Then Value.Controls.Add(Combo)

    End Sub

    Protected Overloads Overrides Sub UpdateUI(ByVal Source As CurrencyManager, _

                              Val RowNum As Integer, ByVal InstantText As String)

        Combo.Text = GetText(GetColumnValueAtRow(Source, RowNum))

        If Not (InstantText Is Nothing) Then

            Combo.Text = InstantText

        End If

    End Sub

---未完,见(三)使用代码一文---------

声明:本文版权与解释权归韩睿所有,如需转载,请保留完整的内容及此声明。

内容概要:本文系统研究了基于模型预测控制(MPC)滚动优化的微电网多时间尺度能量管理调度方法,提出了一种结合多时间尺度协调机制与MPC滚动优化框架的调度模型,旨在应对可再生能源出力波动性和负荷不确定性带来的运行挑战。研究详细构建了包含风光储等多种分布式能源的微电网系统架构,设定了以运行成本最小化、碳排放降低和系统稳定性提升为核心的多目标优化函数,并充分考虑设备运行约束、功率平衡约束及储能动态特性等关键因素。文中给出了完整的Python代码实现方案,涵盖模型搭建、优化求解与结果可视化全过程,支持读者复现、验证并进一步拓展算法。该方法有效提升了微电网在复杂运行环境下的经济性、可靠性和低碳化水平。; 适合人群:具备一定电力系统分析基础和Python编程能力,从事微电网、综合能源系统、智能配电网、优化调度等领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:① 掌握MPC在微电网能量管理中的建模思想与实现流程;② 复现并改进多时间尺度调度模型,服务于学术论文撰写或实际项目开发;③ 深入理解滚动优化、预测误差修正与多时间尺度协调控制的技术内涵与工程价值。; 阅读建议:建议读者结合所提供的Python代码逐模块学习,理解各时间尺度(如日前、日内、实时)之间的衔接逻辑,配合优化理论与电力系统运行知识进行深入分析,鼓励在仿真平台中调整参数、设置不同场景以测试模型鲁棒性,从而全面提升对先进能量管理系统的设计与应用能力。
内容概要:本文围绕基于模型预测控制(MPC)的波浪能转换器(WEC)系统展开研究,系统阐述了如何利用Matlab代码实现MPC算法在WEC中的建模与仿真全过程。研究基于WEC的动力学特性,构建了精确的预测控制模型,通过引入滚动优化机制与实时反馈校正,有效提升了波浪能捕获效率与系统响应性能。文中详细解析了MPC控制器的核心设计流程,涵盖状态空间建模、预测时域设定、代价函数构造、系统约束处理及优化求解等关键技术环节,并配套提供了完整的Matlab代码实现方案,具有较强的可复现性与工程参考价值。; 适合人群:具备自动控制理论基础和Matlab编程能力的研究生、科研人员,以及从事海洋可再生能源系统开发的工程技术人员。; 使用场景及目标:①应用于波浪能发电系统的控制器设计与动态性能优化;②为海洋能源领域中模型预测控制策略的研究提供典型案例与技术参考;③支持高等院校及科研机构开展新能源控制技术相关的教学演示与实验研究; 阅读建议:建议读者结合提供的Matlab代码逐模块分析算法实现逻辑,重点钻研系统建模方法与控制器参数整定策略,可尝试调整波浪激励信号频谱特性或引入不同物理约束条件,观察控制效果的变化,从而深入掌握MPC在复杂可再生能源系统中的实际应用技巧与优化思路。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值