none
Es posible utilizar un ComboBox en un DataGridView con 2 DataSources distintos?? RRS feed

  • Pregunta

  • Verán, este es el tema... tengo un DataGridView con varias columnas, entre ellas 2 ComboBox, el primero de ellos determina la forma de pago (Por ejemplo 1,2 o 3), dependiendo de esta forma de pago seleccionada, la siguiente ComboBox Column, y he aqui el problema que tengo, debería de cargarse con los items de determinado DataSource (Para 1 seria DataSource1, para el 2 el DS 2, y asi...). Es posible realizarlo de este modo?? Hasta ahora logro no logro aplicar esa dualidad o variabilidad de los DataSources para el mismo ComboBox en distintas filas del DataGridView, he intentado limpiando colocandole NOTHING al DataSource, asi como eliminando los Items del ComboBox antes de asignarle el nuevo DataSource, pero nada, simplemente me arroja un error interno que dice algo asi como: "El Valor de DataGridViewComboBoxCell no es valido".

    Si me pueden ayudar les estaría muy agradecido.

    Saludos desde Caracas Venezuela.

    miércoles, 22 de abril de 2015 14:21

Respuestas

  • Entiendo que estamos hablando de Windows Forms y VB.NET

        Private Sub DataGridView1_CellValidated(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellValidated
            Dim grid As DataGridView = sender
            If grid.Columns(e.ColumnIndex).Name = "Combo1" Then
                Dim cell2 As DataGridViewComboBoxCell = grid.Rows(e.RowIndex).Cells("Combo2")
                cell2.Value = Nothing
                Select Case CType(grid.Rows(e.RowIndex).Cells(e.ColumnIndex).Value, String)
                    Case "1"
                        cell2.DataSource = ds1
                    Case "2"
                        cell2.DataSource = ds2
                    Case "3"
                        cell2.DataSource = ds3
                    Case Else
                        cell2.DataSource = Nothing
                End Select
            End If
        End Sub

    miércoles, 22 de abril de 2015 18:21

Todas las respuestas

  • Hola, te paso un ejemplo que acabo de hacer, espero te sirva.

    En este caso, tengo un Gridview con cinco filas, en cada fila hay dos dropdownlist, al seleccionar el valor del primero, automaticamente cambia los valores del segundo.

    <head runat="server">
        <title>Página sin título</title>
    
        <script runat="server">
            
            Protected Sub On_Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
                If Not IsPostBack Then
                    Dim FilasGridView() As String = {"uno", "dos", "tres", "cutro", "cinco"}
                    GridView1.DataSource = FilasGridView
                    GridView1.DataBind()
                End If
            End Sub
            
            Private Sub GridView1_RowCreated(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridView1.RowDataBound
                Dim Datos() As String = {"Numeros", "Letras", "Ordinales"}
                
                If e.Row.RowType = DataControlRowType.DataRow Then
                    Dim list As DropDownList = CType(e.Row.FindControl("DropDownList1"), DropDownList)
                    AddHandler list.SelectedIndexChanged, AddressOf List_SelectedIndexChanged
                    list.DataSource = Datos
                    list.DataBind()
                    list.SelectedIndex = 0
                    Dim list2 As DropDownList = CType(e.Row.FindControl("DropDownList2"), DropDownList)
                    SetDatasource(0, list2)
                End If
            End Sub
            
            Private Sub GridView1_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridView1.RowCreated
                If e.Row.RowType = DataControlRowType.DataRow Then
                    Dim list As DropDownList = CType(e.Row.FindControl("DropDownList1"), DropDownList)
                    AddHandler list.SelectedIndexChanged, AddressOf List_SelectedIndexChanged
                End If
            End Sub
            
            Private Sub SetDatasource(ByVal Index As Integer, ByVal List As DropDownList)
                Dim ds1() As String = {"Uno", "Dos", "Tres", "Cuatro", "Cinco", "Seis"}
                Dim ds2() As String = {"A", "B", "C", "D", "E"}
                Dim ds3() As String = {"Primero", "Segundo", "Tercero", "Cuarto"}
                Dim DS()() As String = {ds1, ds2, ds3}
                List.DataSource = DS(Index)
                List.DataBind()
            End Sub
            
            Private Sub List_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs)
                
                Dim list As DropDownList = CType(sender.parent.parent.FindControl("DropDownList2"), DropDownList)
                SetDatasource(CType(sender, DropDownList).SelectedIndex, list)
              
            End Sub
           
        </script>
    
    
    </head>
    <body>
        <form id="form1" runat="server" onclick="return form1_onclick()">
            <asp:GridView runat="server" ID="GridView1" AutoGenerateColumns="false">
                <Columns>
                    <asp:TemplateField >
                        <ItemTemplate>
                            Origen:<asp:DropDownList ID="DropDownList1" AutoPostBack="true"  runat="server">
                            </asp:DropDownList></ItemTemplate>
                    </asp:TemplateField>
                    <asp:TemplateField>
                        <ItemTemplate>
                            Datos:<asp:DropDownList ID="DropDownList2" runat="server" >
                            </asp:DropDownList></ItemTemplate>
                    </asp:TemplateField>
                </Columns>
            </asp:GridView>
        </form>
    </body>
    

    Espero te sirva, saludos.

    miércoles, 22 de abril de 2015 16:45
  • Entiendo que estamos hablando de Windows Forms y VB.NET

        Private Sub DataGridView1_CellValidated(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellValidated
            Dim grid As DataGridView = sender
            If grid.Columns(e.ColumnIndex).Name = "Combo1" Then
                Dim cell2 As DataGridViewComboBoxCell = grid.Rows(e.RowIndex).Cells("Combo2")
                cell2.Value = Nothing
                Select Case CType(grid.Rows(e.RowIndex).Cells(e.ColumnIndex).Value, String)
                    Case "1"
                        cell2.DataSource = ds1
                    Case "2"
                        cell2.DataSource = ds2
                    Case "3"
                        cell2.DataSource = ds3
                    Case Else
                        cell2.DataSource = Nothing
                End Select
            End If
        End Sub

    miércoles, 22 de abril de 2015 18:21