Populate GridView through another GridView

12 posts, 2 answers
  1. Flávio
    Flávio avatar
    16 posts
    Member since:
    Jun 2011

    Posted 12 Sep 2011 Link to this post

    Hi,

       I'm creating a window with a GridView 01 where I need open other window with a GridView 02 for select some values and set in GridView 01 the selected values. I'd like know how to do set the selected values of GridView 02 to GridView 01?
    Image with a sample attached.

    Thankful for attention!
      
  2. tuonglam
    tuonglam avatar
    3 posts
    Member since:
    Sep 2011

    Posted 13 Sep 2011 Link to this post

    this's good question :x i expect the answer.thank you
  3. UI for WinForms is Visual Studio 2017 Ready
  4. Emanuel Varga
    Emanuel Varga avatar
    1336 posts
    Member since:
    May 2010

    Posted 14 Sep 2011 Link to this post

    Hello,

    Do they have the same type as the datasource? Which type of data source are you using? IList, DataTable ... ?

    Please answer these questions first and then i can help you, but in my point of view you could use the code posted in this code library article to achieve this. (+ you can give drag and drop functionality to the users :P)

    Best Regards,
    Emanuel Varga
  5. Flávio
    Flávio avatar
    16 posts
    Member since:
    Jun 2011

    Posted 14 Sep 2011 Link to this post

    Hi Emanuel,

       I saw your sample and I implemented in other window, it's very nice! In this situation I can't use DragAndDrop.
    Yeah, they have the same datasource and using IList!

    In the GridView02 I am using the following code:

    private void AddSelectedStage(object sender, EventArgs e)
         {
             IList<Dominio.Entidades.Estagio> listSelectedStages = new List<Dominio.Entidades.Estagio>();
             Dominio.Entidades.Estagio obj;
             var checkedRows = this.GrdEstagios.Rows.Where(r => r.Cells["estSeleciona"].Value != null && r.Cells["estSeleciona"].Value is bool && (bool)r.Cells["estSeleciona"].Value);           
             foreach (var i in checkedRows)
             {
                 obj = new Dominio.Entidades.Estagio();
                 obj.estId = int.Parse(i.Cells["estId"].Value.ToString());
                 obj.estDescricao = i.Cells["estDescricao"].Value.ToString();
                 listSelectedStages.Add(obj);        
             }
             FrmTemplate frmTemplate = new FrmTemplate();
             frmTemplate.SetSelectedStages(listSelectedStages);
             this.Close();
         }

    The method SetSelectedStages(listSelectedStages) received the selected values of the GridView 02 and pass the values to GridView 01, but GridView 01 couldn't load the values.

    In the GridView 01 I using the following code:

    private void SetSelectedStages(IList<Dominio.Entidades.Estagio> _listSelectedStages)
        {
            this.radGridView1.BeginUpdate();
            foreach (var i in _listSelectedStages)
            {
                this.radGridView1.Rows.Add(i.estId, i.estDescricao);
            }
            this.radGridView1.EndUpdate();
        }

    Do you have any tip?

    Thankful for your attention!
  6. Answer
    Emanuel Varga
    Emanuel Varga avatar
    1336 posts
    Member since:
    May 2010

    Posted 14 Sep 2011 Link to this post

    Hello Flavio,

    It will go something like this, i will write a rough estimation, hope it will be ok

    Create a property SelectedStages in the 2nd form, and then change your code like so:
    private void AddSelectedStage(object sender, EventArgs e)
    {
        SelectedStages = this.GrdEstagios.Rows.Where(r => r.Cells["estSeleciona"].Value != null && r.Cells["estSeleciona"].Value is bool && (bool)r.Cells["estSeleciona"].Value)
            .Select(r => r.DataBoundItem)
            .Cast<Dominio.Entidades.Estagio>()
            .ToList();
        this.Close();
    }

    and in your main form, just take the datasource of your grid and add these to it, not with rows...
    private void SetSelectedStages(IList<Dominio.Entidades.Estagio> _listSelectedStages)
    {
        this.radGridView1.BeginUpdate();
        var dataSource = GrdEstagios.DataSource as IList<Dominio.Entidades.Estagio>;
        if (dataSource != null)
            _listSelectedStages.ToList().ForEach(dataSource.Add);
        this.radGridView1.EndUpdate();
    }

    And it should be ok.

    Best Regards,
    Emanuel Varga
  7. Flávio
    Flávio avatar
    16 posts
    Member since:
    Jun 2011

    Posted 14 Sep 2011 Link to this post

    Hi Emanuel.

       I tried implement your code, but isn't work. When I call to the method SetSelectedStages, var datasource is receiving null.
    Do you have any tip?

    Thankful for your attention!
  8. Emanuel Varga
    Emanuel Varga avatar
    1336 posts
    Member since:
    May 2010

    Posted 14 Sep 2011 Link to this post

    Hello again,

    What is the datasource on the main grid?
  9. Flávio
    Flávio avatar
    16 posts
    Member since:
    Jun 2011

    Posted 14 Sep 2011 Link to this post

    Hi,

      Follow the code of my main GridView and secondary GridView:

    Main GridView:

    private void PrepareGrid(RadGridView grid)
           {
               GridViewTextBoxColumn estIdColumn = new GridViewTextBoxColumn("estId""estId");
               estIdColumn.Width = 70;
               estIdColumn.HeaderText = "Estágio Id";
               estIdColumn.IsVisible = false;
               GridViewTextBoxColumn estDescricaoColumn = new GridViewTextBoxColumn("estDescricao""estDescricao");
               estDescricaoColumn.Width = 200;
               estDescricaoColumn.HeaderText = "Descrição";
               estDescricaoColumn.ReadOnly = true;
               GridViewCommandColumn commandColumn = new GridViewCommandColumn("estAdicionaRecurso""estAdicionaRecurso");
               commandColumn.Width = 15;
               commandColumn.HeaderText = "[+] Recurso";
     
               grid.Columns.Add(estIdColumn);
               grid.Columns.Add(estDescricaoColumn);
               grid.Columns.Add(commandColumn);
               //grid.TableElement.RowHeight = 50;
               grid.MasterTemplate.AllowRowReorder = true;
               grid.ReadOnly = false;
               grid.MultiSelect = true;
               grid.MasterTemplate.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill;
     
               grid.GridBehavior = new CustomGridBehavior();
           }

    Secondary GridView:

    private void PrepareGrid(RadGridView grid)
           {
               GridViewTextBoxColumn estIdColumn = new GridViewTextBoxColumn("estId", "estId");
               estIdColumn.Width = 70;
               estIdColumn.HeaderText = "Estágio Id";
               estIdColumn.IsVisible = false;
               GridViewTextBoxColumn estDescricaoColumn = new GridViewTextBoxColumn("estDescricao", "estDescricao");
               estDescricaoColumn.Width = 200;
               estDescricaoColumn.HeaderText = "Descrição";
               estDescricaoColumn.ReadOnly = true;
               GridViewCheckBoxColumn checkColumn = new GridViewCheckBoxColumn("estSeleciona", "estSeleciona");
               checkColumn.Width = 15;
               checkColumn.HeaderText = "";
     
               grid.Columns.Add(estIdColumn);
               grid.Columns.Add(estDescricaoColumn);
               grid.Columns.Add(checkColumn); 
               //grid.TableElement.RowHeight = 50;
               grid.MasterTemplate.AllowRowReorder = true;
               grid.ReadOnly = false;
               grid.MultiSelect = true;
               grid.MasterTemplate.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill;
     
               grid.GridBehavior = new CustomGridBehavior();
           }
     
           private void GrdEstagio_Load(object sender, EventArgs e)
           {
               this.PrepareGrid(this.GrdEstagios);
     
               IList<Dominio.Entidades.Estagio> listaEstagio = this._estagioServico.RetornaTodos();            
               foreach (var i in listaEstagio)
               {
                   this.GrdEstagios.Rows.Add(i.estId, i.estDescricao);
               }
           }


    Thankful for your attention!
  10. Answer
    Emanuel Varga
    Emanuel Varga avatar
    1336 posts
    Member since:
    May 2010

    Posted 14 Sep 2011 Link to this post

    Hello,

    Instead of doing this:
    foreach (var i in listaEstagio)
    {
        this.GrdEstagios.Rows.Add(i.estId, i.estDescricao);
    }
    do this:
    GrdEstagios.DataSource = listaEstagio;

    and let me know if you still have problems

    Best Regards,
    Emanuel Varga
  11. Flávio
    Flávio avatar
    16 posts
    Member since:
    Jun 2011

    Posted 15 Sep 2011 Link to this post

    Hi,

      I could get values of GridView 02 of secondary window to main window, but GridView 01 isn't showing the values yet.
    Follow my code:

    Main Window:

    This code is responsible for showing the secondary window where it contains GridView 02.

    private void AbrirTelaEstagios(object sender, EventArgs e)
            {
                GrdEstagio obj = new GrdEstagio();
                obj.ShowDialog();
            }

    GridView 02:

    This code get selected values and call the method PopularGrid, where this is responsible for passing all selected values to GridView 01 in Main window.

    private void AdicionarEstagiosSelecionados(object sender, EventArgs e)
        {
            var SelectedStages = this.GrdEstagios.Rows.Where(r => r.Cells["estSeleciona"].Value != null && r.Cells["estSeleciona"].Value is bool && (bool)r.Cells["estSeleciona"].Value)
                                  .Select(r => r.DataBoundItem)
                                  .Cast<Dominio.Entidades.Estagio>()
                                  .ToList();
            FrmTemplate frmTemplate = new FrmTemplate();           
            frmTemplate.PopularGrid(SelectedStages, this.GrdEstagios); //Set selected values to GridView 01
            this.Hide();
        }



    GridView 01:

    This code get values selected in GridView 02 and set the values selected in GridView 01.

    public void PopularGrid(List<Dominio.Entidades.Estagio> _listaEstagios, RadGridView _grdEstagios)
          {
              this.radGridView1.MasterTemplate.BeginUpdate();
              var dataSource = _grdEstagios.DataSource as IList<Dominio.Entidades.Estagio>;
              if (dataSource != null)
              {
                  _listaEstagios.ForEach(dataSource.Add);
                  this.radGridView1.DataSource = _listaEstagios;               
              }
              this.radGridView1.MasterTemplate.EndUpdate();
          }


    Thankful for your attention!
  12. Flávio
    Flávio avatar
    16 posts
    Member since:
    Jun 2011

    Posted 19 Sep 2011 Link to this post

    Hi,

       Any tips?

  13. Flávio
    Flávio avatar
    16 posts
    Member since:
    Jun 2011

    Posted 19 Sep 2011 Link to this post

    Hi Emanuel,

      I solved it! I created a static class for save the selected values in GridView 02 and set values in GridView 01 when secondary window is closed.
    Follow my code:

    Main Window:

    This code is responsible for showing the secondary window where it contains GridView 02.

    private void AbrirTelaEstagios(object sender, EventArgs e)
        {
            GrdEstagio obj = new GrdEstagio();
            obj.ShowDialog();
            ListarEstagiosSelecionados();
        }
     
        private void ListarEstagiosSelecionados()
        {
            this.GrdEstagiosSelecionados.MasterTemplate.BeginUpdate();
            this.GrdEstagiosSelecionados.DataSource = ListaGlobal.ListaEstagios;
            this.GrdEstagiosSelecionados.MasterTemplate.EndUpdate();
        }

    GridView 02:

    This code get selected values and call the method PopularGrid, where this is responsible for passing all selected values to GridView 01 in Main window.

    private void AdicionarEstagiosSelecionados(object sender, EventArgs e)
        {
            var SelectedStages = this.GrdEstagios.Rows.Where(r => r.Cells["estSeleciona"].Value != null && r.Cells["estSeleciona"].Value is bool && (bool)r.Cells["estSeleciona"].Value)
                                  .Select(r => r.DataBoundItem)
                                  .Cast<Dominio.Entidades.Estagio>()
                                  .ToList();
            FrmTemplate frmTemplate = new FrmTemplate();           
            frmTemplate.PopularGrid(SelectedStages, this.GrdEstagios);
            this.Hide();
        }


    GridView 01:

    This code get values selected in GridView 02 and set the values selected in GridView 01.

    public void PopularGrid(List<Dominio.Entidades.Estagio> _listaEstagios, RadGridView _grdEstagios)
    {
        var dataSource = _grdEstagios.DataSource as IList<Dominio.Entidades.Estagio>;
        if (dataSource != null)
        {
            _listaEstagios.ForEach(dataSource.Add);
            //Set all selected values of GridView 02 in static class ListaGlobal.
            ListaGlobal.ListaEstagios = _listaEstagios;
        }
    }

    Class ListaGlobal:

    This class get the selected values of GridView 02 for set values in GridView 01.

    public class ListaGlobal
     {
         private static List<Estagio> listaEstagios;
     
         public static List<Estagio> ListaEstagios
         {
             get { return listaEstagios; }
             set { listaEstagios = value; }
         }
     }


    Thankful for your attention!


Back to Top
UI for WinForms is Visual Studio 2017 Ready