none
como Salir de un procedimiento RRS feed

  • Pregunta

  • Buenas tengo este codigo y me gustaria que no se ejecutase si me sale un mensaje desde otro sub de otro formulario

    Private Sub DGV_Lupulos_CurrentCellDirtyStateChanged(sender As Object, e As EventArgs) Handles DGV_Lupulos.CurrentCellDirtyStateChanged If DGV_Lupulos.IsCurrentCellDirty Then DGV_Lupulos.CommitEdit(DataGridViewDataErrorContexts.Commit) End If If DGV_Lupulos.CurrentRow.Cells(1).Value Is Nothing Then Else If DGV_Lupulos.IsCurrentCellDirty Then DGV_Lupulos.CommitEdit(DataGridViewDataErrorContexts.Commit) End If End If End Sub Private Sub DGV_Lupulos_CellEndEdit(sender As Object, e As DataGridViewCellEventArgs) Handles DGV_Lupulos.CellEndEdit If e.ColumnIndex = 0 Then Call Inicio.Comprueba_Inventario() End If End Sub Private Sub DGV_Lupulos_CellValueChanged(sender As Object, e As DataGridViewCellEventArgs) Handles DGV_Lupulos.CellValueChanged If DGV_Lupulos.Columns(e.ColumnIndex).Name = "Col_Nombre_Lupulo" Then 'HACE QUE CELLVALUECHANGED NO DE ERROR If DGV_Lupulos.CurrentRow.Cells(0).Value Is Nothing Then Else DGV_Lupulos.EndEdit() End If

    *** AQUI ES DONDE SE TIENE QUE SALIR SI SALE EL MENSAJE***

    If DGV_Lupulos.CurrentRow.Cells(1).Value Is Nothing Then For a = 0 To Dgv_Tabla_Lupulos.RowCount - 1 Dim Lupulo_Estock As String = DGV_Lupulos.CurrentRow.Cells(0).Value If Dgv_Tabla_Lupulos.Rows(a).Cells(1).Value.Contains(DGV_Lupulos.CurrentRow.Cells(0).Value) Then DGV_Lupulos.CurrentRow.Cells(1).Value = 20 ' PESO DEL LUPULO POR DEFECTO DGV_Lupulos.CurrentRow.Cells(2).Value = 60 ' TIEMPO DE HERVIDO DEL LUPULO POR DEFECTO DGV_Lupulos.CurrentRow.Cells(3).Value = "Hervido" 'TIPO DE AÑADIDO DEL LUPULO POR DEFECTO DGV_Lupulos.CurrentRow.Cells(4).Value = "Flor" 'TIPO DE LUPULO AÑIDO POR DEFECTO DGV_Lupulos.CurrentRow.Cells(8).Value = Replace(Dgv_Tabla_Lupulos.Rows(a).Cells(2).Value, " %", "") 'AÑADE EL ALPHA ACIDO DEL LUPULO End If Next If TextBox1.Text = "" Then LabelX40.Text = "0.0" TextBox10.Text = "0.0" Else Calc_Ibus() End If Else For a = 0 To Dgv_Tabla_Lupulos.RowCount - 1 If Dgv_Tabla_Lupulos.Rows(a).Cells(1).Value.Contains(DGV_Lupulos.CurrentRow.Cells(0).Value) Then DGV_Lupulos.CurrentRow.Cells(8).Value = Replace(Dgv_Tabla_Lupulos.Rows(a).Cells(2).Value, " %", "") 'AÑADE EL ALPHA ACIDO DEL LUPULO End If Next If TextBox1.Text = "" Then LabelX40.Text = "0.0" TextBox10.Text = "0.0" Else Calc_Ibus() End If End If Else If TextBox1.Text = "" Then LabelX40.Text = "0" TextBox10.Text = "0.0" Else Calc_Ibus() End If End If End Sub


    domingo, 17 de septiembre de 2017 19:50

Respuestas

  • Hay dos opciones: La primera es cambiar la parte donde dices "los 2 mensajes tanto si no existe como si si existe tiene el mismo boton de OK". Puedes ponerles a los dos mensajes que devuelvan un DialogResult diferente (que no se notará visualmente: aunque en los dos botones ponga "Ok", en el codigo que se dispara al pulsar el botón puedes hacer que devuelvan por ejemplo DialogResult.Yes y DialogResult.No, o cualquier otro par de valores que te resulte conveniente. Eso te permitiria que el "If" que hace Exit Sub solo salga con uno de los dos valores.

    Más o menos sería algo parecido a lo siguiente, pero hago énfasis en "parecido". No te lo tomes al pie de la letra, hay que amoldarlo según como tengas organizado el funcionamiento de tu form:

                If contador1 > 0 Then
                    MsgBox("Si esta en estock ")
                    Me.DialogResult = DialogResult.Yes
                Else
                    MsgBox("No esta en estock ")
                    Me.DialogResult = DialogResult.No
                End If
    

    La otra opción vuelve a pasar por la variable booleana. Haz que un botón ponga True y el otro False en la variable, y luego compruábala en el If antes de hacer el Exit Sub.

    • Propuesto como respuesta Jorge TurradoMVP lunes, 18 de septiembre de 2017 9:11
    • Marcado como respuesta JETET lunes, 18 de septiembre de 2017 19:27
    lunes, 18 de septiembre de 2017 8:46

Todas las respuestas

  • Bueno salirse es muy fácil, basta con esto:

    If SalioElMensaje Then Exit Sub

    Donde pone "SalioElMensaje", eso sería una variable booleana que tendrás que poner a True desde el sitio en donde sale el mensaje en cuestión, que no se ve o no queda claro en el código que has mostrado. Y, obviamente, al igual que cualquier otra variable que se tenga que usar desde dos sitios, hay que declararla en algún sitio donde su alcance haga que sea visible a los dos procedimientos (el que le asigna el valor y el que lo lee).

    domingo, 17 de septiembre de 2017 20:15
  • alberto 

    el  mensaje se genera desde un sub que se llama desde esta parte del codigo

    No se a que te refieres por declarar un mensaje

    Private Sub DGV_Lupulos_CellEndEdit(sender As Object, e As DataGridViewCellEventArgs) Handles DGV_Lupulos.CellEndEdit
            If e.ColumnIndex = 0 Then
                Call Inicio.Comprueba_Inventario()
            End If
        End Sub

    y este es el sub al que llama donde esta el mensaje esta en otro formulario

    'COMPRUEBA INVENTARIO
        Sub Comprueba_Inventario()
    
            If System.IO.File.Exists("Datos\Inventario.xml") Then
                CB_tipo_Inventario.SelectedIndex = 0
                CBInventario.SelectedIndex = 0
                XmlDocument_Inventario = New XmlDocument
                XmlDocument_Inventario.Load("Datos/Inventario.xml")
                 XmlNodeList_Inventario = XmlDocument_Inventario.SelectNodes("Inventario/Ingrediente")
                Dim Contador As Integer = 0
                Dim contador1 As Integer = 0
                For Each node As Xml.XmlNode In XmlNodeList_Inventario
    
                    Dim Lupulo_Estock As String = node.ChildNodes(0).InnerText
                    
                    
                    Select True
    
                        Case Receta_Nueva.DGV_Lupulos.Focused = True
                            If node.ChildNodes(0).InnerText.Contains(Receta_Nueva.DGV_Lupulos.CurrentRow.Cells(0).Value) = True Then
                                contador1 += 1
                            End If
                        Case Receta_Nueva.ComboBox4.Focused = True
                            If node.ChildNodes(0).InnerText.Contains(Receta_Nueva.ComboBox4.SelectedIndex) = True Then
                                contador1 += 1
                            End If
                    End Select
                   
                    
                    ' '' ''If Not Receta_Nueva.Col_Nombre_Lupulo.Items.Contains(Lupulo_Estock) Then
                    ' '' ''    Receta_Nueva.Col_Nombre_Lupulo.Items.Add(node.ChildNodes(0).InnerText)
                    ' '' ''End If
    
                Next
                If contador1 > 0 Then
                    MsgBox("Si esta en estock ")
                Else
                    MsgBox("No esta en estock ")
                End If
    
    
                
    
    
            Else
    
            End If
    
        End Sub
        'COMPRUEBA INVENTARIO

     
    domingo, 17 de septiembre de 2017 20:50
  • No se a que te refieres por declarar un mensaje

    No, no he dicho nada de declarar un mensaje. He dicho de declarar una VARIABLE. La idea es que cuando sale el mensaje, guardas True en la variable (y si no sale el mensaje, la dejas en False). Y después, en el sitio donde quieres salir del procedimiento, te sales si la variable vale True.
    lunes, 18 de septiembre de 2017 6:35
  • Buenas Alberto

    con este codigo me funciona, pero tengo un problema 

    Es que el mensaje que salta es por que comprueba un estock 

    los 2 mensajes tanto si no existe como si si existe tiene el mismo boton de OK

    entonces siempre se lase del sub

    gracias

     If System.Windows.Forms.DialogResult.OK = 1 Then
    
                    Exit Sub
                End If

    lunes, 18 de septiembre de 2017 7:00
  • Hay dos opciones: La primera es cambiar la parte donde dices "los 2 mensajes tanto si no existe como si si existe tiene el mismo boton de OK". Puedes ponerles a los dos mensajes que devuelvan un DialogResult diferente (que no se notará visualmente: aunque en los dos botones ponga "Ok", en el codigo que se dispara al pulsar el botón puedes hacer que devuelvan por ejemplo DialogResult.Yes y DialogResult.No, o cualquier otro par de valores que te resulte conveniente. Eso te permitiria que el "If" que hace Exit Sub solo salga con uno de los dos valores.

    Más o menos sería algo parecido a lo siguiente, pero hago énfasis en "parecido". No te lo tomes al pie de la letra, hay que amoldarlo según como tengas organizado el funcionamiento de tu form:

                If contador1 > 0 Then
                    MsgBox("Si esta en estock ")
                    Me.DialogResult = DialogResult.Yes
                Else
                    MsgBox("No esta en estock ")
                    Me.DialogResult = DialogResult.No
                End If
    

    La otra opción vuelve a pasar por la variable booleana. Haz que un botón ponga True y el otro False en la variable, y luego compruábala en el If antes de hacer el Exit Sub.

    • Propuesto como respuesta Jorge TurradoMVP lunes, 18 de septiembre de 2017 9:11
    • Marcado como respuesta JETET lunes, 18 de septiembre de 2017 19:27
    lunes, 18 de septiembre de 2017 8:46
  • Gracias por la ayuda

    no consigo la combinacion correncta por que Ej: cuando elijo Agnus que no esta en hace lo correcto que es no rellenar las demas celdas

    Pero si elijo amarillo si tenia que rellenar las casillas y no estan rellenar por aver elejido primero uno que no esta en estock

    pero si lo hago al reves primero elijo amarillo si rellena pero despues elijo agnus tambien me lo rellena cuando no lo tendria que rellenar por que no esta en estock

    Gracias por toda la ayuda

    If contador1 > 0 Then
                    'MsgBox("Si esta en estock ", MsgBoxStyle.Information, "Info")
                    MsgBox("Si esta en estock ")
                    Me.DialogResult = DialogResult.Yes
    
                    
                Else
    
                    'MsgBox("No esta en estock.", MsgBoxStyle.Critical, "Info")
                    MsgBox("No esta en estock ")
                    Me.DialogResult = DialogResult.No
                    'MsgBox("No esta en estock ")
    
                End If

    If DialogResult.No = 7 Then
    
                    Exit Sub
    
                Else
    
                    If DGV_Lupulos.CurrentRow.Cells(1).Value Is Nothing Then
                        For a = 0 To Dgv_Tabla_Lupulos.RowCount - 1
                            Dim Lupulo_Estock As String = DGV_Lupulos.CurrentRow.Cells(0).Value
                            If Dgv_Tabla_Lupulos.Rows(a).Cells(1).Value.Contains(DGV_Lupulos.CurrentRow.Cells(0).Value) Then
                                DGV_Lupulos.CurrentRow.Cells(1).Value = 20 ' PESO DEL LUPULO POR DEFECTO
                                DGV_Lupulos.CurrentRow.Cells(2).Value = 60 ' TIEMPO DE HERVIDO DEL LUPULO POR DEFECTO
                                DGV_Lupulos.CurrentRow.Cells(3).Value = "Hervido" 'TIPO DE AÑADIDO DEL LUPULO POR DEFECTO
                                DGV_Lupulos.CurrentRow.Cells(4).Value = "Flor" 'TIPO DE LUPULO AÑIDO POR DEFECTO
                                DGV_Lupulos.CurrentRow.Cells(8).Value = Replace(Dgv_Tabla_Lupulos.Rows(a).Cells(2).Value, " %", "") 'AÑADE EL ALPHA ACIDO DEL LUPULO
    
                            End If
                        Next

    lunes, 18 de septiembre de 2017 9:30
  • Veo algo muy raro en tu código. ¿Qué quiere decir eso de If DialogResult.No = 7 Then Exit Sub? Tendría que ser así:

    If elDialogResultQueMeDevolvioMiFormulario = DialogResult.No Then Exit Sub

    Si pones DialogResult.No = 7 no vale para nada, porque estas comparando la definicion del Enum con el valor que lo define, luego siempre seran iguales, y no estas mirando que es lo que te devolvio tu formulario.

    Y dicho sea de paso, por la misma razon tampoco valia para nada el codigo que pusiste originalmente "If System.Windows.Forms.DialogResult.OK = 1".

    lunes, 18 de septiembre de 2017 14:57
  • Gracias Alberto 

    Al final lo he solucionado de esta manera gracias a tu ayuda

    Public Shared Estock_si_no As Boolean  'VARIABLE PUBLICA

    esto dentro del sub

    If contador1 > 0 Then
                    MsgBox("Si esta en estock ", MsgBoxStyle.OkOnly, "Info")
                    Estock_si_no = True
                    
                Else
    
                    MsgBox("No esta en estock.", MsgBoxStyle.Critical, "Info")
                    Estock_si_no = False
                End If

    y esto dentro del procedimiento

    If Inicio.Estock_si_no = False Then Exit Sub Else

    end if


    lunes, 18 de septiembre de 2017 18:49