【问题标题】:Making panel or groupbox visible throws Argumentoutofrangeexception使面板或组框可见会引发 Argumentoutofrangeexception
【发布时间】:2014-09-24 15:54:36
【问题描述】:

我在 vb.net 中有一个 MVC winform 应用程序,

有一个 BaseController 引用了一个 Model,并且 2 个具体控制器继承自这个 BaseController。

InitializeComponent() 之前实例化一个控制器,然后调用InitializeComponent,然后,一些类似这样的绑定:

chkGeolocalizacion.DataBindings.Add("Checked", controller.Model, "SolicitarGeolocalizacion", False, DataSourceUpdateMode.OnPropertyChanged)

chkGeolocalizacion 位于组框或面板内(都尝试过)。

然后表单等待用户输入在 2 个单选按钮之间进行选择,并触发一个事件,该事件将控制器替换为用户选择的控制器。之后,我想让绑定了控件并引发 Argumentoutofrangeexception 的组框可见,例如“值 0 不在最小值和最大值之间”。

如果我从不修改可见属性,代码将完美运行。

Dim modelo As Model_Reporte = controller.Model
If rbtScoringDistancia.Checked Then
    controller = New Reporte_controller_SinK()
    chkGeolocalizacion.Visible = True
Else
    controller = New Reporte_Controller(Me)
    chkGeolocalizacion.Visible = False
End If
controller.Model = modelo
pnlConfig.Visible = True

这是 .net 错误还是什么?我无法使其工作,唯一的解决方法是使控件可见/不可见,而不是包含它们的组框或面板

(我尝试了面板和分组框,抛出相同的异常)

谢谢!

ps:如果您需要查看我的更多代码,请索取。

编辑:添加额外代码

Public Class Reporte

Private controller As Reporte_ControllerBase

Public Sub New()
    controller = New Reporte_Controller(Me)
    InitializeComponent()
    addDataBindings()
End Sub

Private Sub addDataBindings()
    dt_fecha_desde.DataBindings.Add("Value", controller.Model, "GetFechaDesde", False, DataSourceUpdateMode.OnPropertyChanged)
    dt_fecha_hasta.DataBindings.Add("Value", controller.Model, "GetFechaHasta", False, DataSourceUpdateMode.OnPropertyChanged)
    KM_Scoring.DataBindings.Add("Value", controller.Model, "KM_Scoring", False, DataSourceUpdateMode.OnPropertyChanged)
    chkGeolocalizacion.DataBindings.Add("Checked", controller.Model, "SolicitarGeolocalizacion", False, DataSourceUpdateMode.OnPropertyChanged)
End Sub

Private Sub rbtScoringDistancia_CheckedChanged(ByVal sender As Object, ByVal e As EventArgs) Handles rbtScoringDistancia.CheckedChanged, rbtScoringAlternativo.CheckedChanged
    Dim modelo As Model_Reporte = controller.Model
    If rbtScoringDistancia.Checked Then
        lblKm.Text = "Iteraciones"
        LblScoring.Text = "Considerar infracción a las "
        controller = New Reporte_controller_SinK()
        chkGeolocalizacion.Visible = True
    Else
        LblScoring.Text = "Evaluar scoring cada "
        lblKm.Text = "Kilómetros"
        controller = New Reporte_Controller(Me)
        chkGeolocalizacion.Visible = False
    End If
    controller.Model = modelo
    pnlConfig.Visible = True 'Exception thrown here
End Sub
End Class

Public Class Reporte_Controller
     Inherits Reporte_ControllerBase
'extra code...
 End Class


Public MustInherit class Reporte_ControllerBase
Protected modelo As Model_Reporte = New Model_Reporte


Public Property Model() As Model_Reporte
    Get
        Return modelo
    End Get
    Set(ByVal value As Model_Reporte)
        modelo = value
    End Set
End Property
End Class

Public Class Model_Reporte

    Private _getFechaDesde As Date = Date.Today.AddMonths(-1)
    Private _getfechaHasta As Date = Date.Today
    Private _kmScoring As Integer
    Private _solicitarGeolocalizacion As Boolean
    Private _limiteRegular As Int32 = 7
    Private _limiteMal As Int32 = 25

'getters and setters for each property
End Class

澄清:如果我之前将面板设置为 false,则除了使面板可见属性为 true 之外,一切正常。如果它是真的并且我不修改它,它可以工作。

edit2:只有在面板或组框上设置可见 = true 时才会引发异常,这些面板或组框具有绑定到控制器模型的多个控件。在另一个包含未绑定控件的 groupbox 上设置 visible = true 或 false 可以完美地工作。

【问题讨论】:

  • 究竟在哪一行崩溃了?抛出异常,这将有助于我们调试它。
  • pnlConfig.Visible = True 异常文本是“El valor de '0' no es válido para 'Value'. 'Value' debería estar entre 'Minimum' y 'Maximum'. Nombre del parametro:值”转换为“值 0 对“值”无效。“值”应介于“最大值”和“最小值”之间,这对属性 Visible 没有意义
  • 介意把剩下的代码扔进去吗?因为到目前为止,您所展示的内容是完美无缺的。
  • 您是否尝试将命令绑定到按钮?只是看看它是否单独工作?一些事情:if pnlConfig.visible = true then pnlConfig.visible = false else pnlConfig.visible = true end(由button.click触发。如果这个错误,那么我一无所知。
  • 有问题...对不起,我不能再帮你了,表单中的某些东西导致了这个错误,我无法在我的计算机上重新创建它(它可以在我的计算机上运行)。确保没有任何东西包裹面板,这也可能导致此错误(?)。祝你好运! (+1 可见性)

标签: vb.net winforms data-binding


【解决方案1】:

我通过在 form_load 事件中添加数据绑定而不是在新事件中添加它们来修复此错误(在调用 InitializeComponents() 之后)。我知道这很奇怪,但这解决了问题。

【讨论】:

  • InitializeComponent() 方法应始终是Windows Form 构造函数中第一个被调用的方法,因为它是负责在表单上创建所有其他控件的方法。
  • 是的,但是发生了一些奇怪的事情......比如 InitializeComponent() 触发了一些需要在之前实例化控制器的事件(项目遵循 MVC 方案),在这种情况下,如果我把InitializeComponent 下相同的确切代码,出现错误,但如果我将该代码放在 form_load 下,错误消失......很奇怪。
  • 这没有什么奇怪的。 Form Load Event 出现在表单第一次显示之前,这意味着表单的每个控件都已正确初始化并可以访问。如果您在调用InitializeComponents() 之后立即放置代码,并且不情愿地触发了一些不需要的事件,则只需在代码之后添加事件处理程序,而不是将它们设置到属性资源管理器中。
  • 不一定,你是对的。在Form 构造函数中,您希望将事件处理程序放置到位,并初始化您知道自己是唯一所有者的任何助手成员或类似人员。
  • 有关事件顺序的更多详细信息:msdn.microsoft.com/en-us/library/86faxx0d(v=vs.110).aspx
猜你喜欢
  • 2013-04-19
  • 2022-08-05
  • 2019-11-30
  • 1970-01-01
  • 2011-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多