C #, Windows Forms, How to implement two ComboxBoxes in a Form but WITH THE SAME datasource?

0

I have two comboboxes in a form with the same datasource:

private void LlenarCbosCatalogo()
{
    AuxiliaresCatalogoCtaList = CatalogoCuentaLN.ObtenerAuxiliares();

    cboAuxiliar.ValueMember = "IdCatalogoCuenta";
    cboAuxiliar.DisplayMember = "NombreCompleto";
    cboAuxiliar.DataSource = AuxiliaresCatalogoCtaList;

    cboPrima.ValueMember = "IdCatalogoCuenta";
    cboPrima.DisplayMember = "NombreCompleto";
    cboPrima.DataSource = AuxiliaresCatalogoCtaList;
}

But when I select an item from the first combo, it also selects itself in the second.

How to avoid this behavior?

    
asked by Geronimo Fernandez 01.10.2018 в 17:11
source

2 answers

1

What I would do is create a Datatable for each Combobox. that is, create a method that transforms your list into a data table. to assign it to your datasource of the combobo.

This is an example of how to convert a list of type string to a data table. I hope I have helped you.

 private void Form1_Load(object sender, EventArgs e)
        {
            // Example list.
            List<string[]> list = new List<string[]>();
            list.Add(new string[] { "Column 1", "Column 2", "Column 3" });
            list.Add(new string[] { "Row 2", "Row 2" });
            list.Add(new string[] { "Row 3" });

            // Convert to DataTable.
            DataTable dtAuxiliar= ConvertListToDataTable(list);
            DataTable dtPrima= ConvertListToDataTable(list);           

            cboAuxiliar.ValueMember = "IdCatalogoCuenta";
            cboAuxiliar.DisplayMember = "NombreCompleto";
            cboAuxiliar.DataSource = dtAuxiliar;

            cboPrima.ValueMember = "IdCatalogoCuenta";
            cboPrima.DisplayMember = "NombreCompleto";
            cboPrima.DataSource = dtPrima;
        }
 static DataTable ConvertListToDataTable(List<string[]> list)
        {
            // New table.
            DataTable table = new DataTable();

            // Get max columns.
            int columns = 0;
            foreach (var array in list)
            {
                if (array.Length > columns)
                {
                    columns = array.Length;
                }
            }

            // Add columns.
            for (int i = 0; i < columns; i++)
            {
                table.Columns.Add();
            }

            // Add rows.
            foreach (var array in list)
            {
                table.Rows.Add(array);
            }

            return table;
        }
    }
}

Another would be to create a variable for each source of the combobox ..

private void LlenarCbosCatalogo()
{
    var AuxiliarList = CatalogoCuentaLN.ObtenerAuxiliares();
    var PrimaList = CatalogoCuentaLN.ObtenerAuxiliares();

    cboAuxiliar.ValueMember = "IdCatalogoCuenta";
    cboAuxiliar.DisplayMember = "NombreCompleto";
    cboAuxiliar.DataSource = AuxiliarList.toList(); 

    cboPrima.ValueMember = "IdCatalogoCuenta";
    cboPrima.DisplayMember = "NombreCompleto";
    cboPrima.DataSource = PrimaList.toList();
}
    
answered by 01.10.2018 / 17:27
source
0

If you do it with a DataSet or a DataTable you can use Copy() you will copy the structure and information to a new element:

private void LlenarCbosCatalogo()
{
    AuxiliaresCatalogoCtaList = CatalogoCuentaLN.ObtenerAuxiliares();
    cboAuxiliar.ValueMember = "IdCatalogoCuenta";
    cboAuxiliar.DisplayMember = "NombreCompleto";
    cboAuxiliar.DataSource = AuxiliaresCatalogoCtaList;
    cboPrima.ValueMember = "IdCatalogoCuenta";
    cboPrima.DisplayMember = "NombreCompleto";
    cboPrima.DataSource = AuxiliaresCatalogoCtaList.Copy();
}

If you use List just create a new list and use AddRange() to create a copy of the list:

private void LlenarCbosCatalogo()
{
    AuxiliaresCatalogoCtaList = CatalogoCuentaLN.ObtenerAuxiliares();
    List<AuxiliaresCatalogo> AuxiliaresCatalogoCtaList2 = new List<AuxiliaresCatalogo>().AddRange(AuxiliaresCatalogoCtaList);

    cboAuxiliar.ValueMember = "IdCatalogoCuenta";
    cboAuxiliar.DisplayMember = "NombreCompleto";
    cboAuxiliar.DataSource = AuxiliaresCatalogoCtaList;

    cboPrima.ValueMember = "IdCatalogoCuenta";
    cboPrima.DisplayMember = "NombreCompleto";
    cboPrima.DataSource = AuxiliaresCatalogoCtaList2;
}
    
answered by 01.10.2018 в 17:19