none
Agrupar Winform RRS feed

  • Pergunta

  • E ae pessoal, estou desenvolvendo um aplicativo em WinForm.

    Uma pessoa me pediu uma tela q mostre as informaçoes agrupadas, como em uma tabela Dinâmica do Excel, o Query esta pronto, mas nao sei como mostrar isso no formulário, a melhor forma que fiquei mais ou menos assim.

    Tipo 1  - aaaa - 10

                 - bbbb - 10

                 - cccc - 30

    Total = 40

    Tipo 2 - eeee - 15

                - fffff - 15

                -gggg - 10

    Total = 40

    Total geral = 80

    São vários tipos de agrupamento(uns 5)  ideal seria algo tipo um datagridview com estes agrupamentos, mas nao sei se eh possivel.

     

     

     

    quinta-feira, 11 de janeiro de 2007 18:41

Respostas

  • PDH,

    Bom, vai um exemplo a partir de um DataTable, supondo que todos os dados necessários estariam nesta tabela. Basta colocar o código no evento Load de um form com um ListView:

    // Vou usar uma fonte bold no total
    Font bold = new Font(this.Font.FontFamily, this.Font.Size, FontStyle.Bold);
    ListViewItem lvi = null;

    // ... e mostrar os dados como Details
    listView1.View = View.Details;
    listView1.Columns.Add(
    "Descrição", 200);
    listView1.Columns.Add(
    "Valor", 100);

    // Aí aqui vou criar uma base de dados de exemplo...
    DataTable dt = new DataTable();
    dt.Columns.Add(
    "tipo", typeof(string));
    dt.Columns.Add(
    "desc", typeof(string));
    dt.Columns.Add(
    "valor", typeof(int));
    dt.Rows.Add(
    new object[] { "Tipo 1", "aaaa", 10 });
    dt.Rows.Add(
    new object[] { "Tipo 1", "bbbb", 10 });
    dt.Rows.Add(
    new object[] { "Tipo 1", "cccc", 30 });
    dt.Rows.Add(
    new object[] { "Tipo 2", "eeee", 15 });
    dt.Rows.Add(
    new object[] { "Tipo 2", "ffff", 15 });
    dt.Rows.Add(
    new object[] { "Tipo 2", "gggg", 10 });

    // Isso aqui teoricamente não seria necessário, já
    // que eu criei os dados já ordenados por tipo. Mas
    // supondo que sua base de dados não esteja ordenada,
    // este seria o primeiro passa a ser feito
    dt.DefaultView.Sort = "tipo";
    string tipo = "";
    int total = 0;

    // Aí vou percorrendo linha a linha...
    foreach (DataRowView dr in dt.DefaultView)

        // Verifico se preciso criar o grupo, que no
        // caso seria o tipo do registro.
        if (tipo != dr["tipo"].ToString())
        {
            // Se for mudar de grupo, tem que pôr o total,
            // desde que não seja a primeira passagem por aqui...
            if (tipo != "")
            {
                lvi = listView1.Items.Add(
    new ListViewItem(new string[] { "Total", total.ToString() }));
                lvi.Group = listView1.Groups[tipo];
                lvi.Font = bold; 
           

            listView1.Groups.Add(dr[
    "tipo"].ToString(), dr["tipo"].ToString());
            tipo = dr[
    "tipo"].ToString();
            total = 0;
        }

        // Vou adicionando os itens...
        listView1.Items.Add(new ListViewItem(new string[] { dr["desc"].ToString(), dr["valor"].ToString() })).Group = listView1.Groups[tipo];

        // ... e somando o total.
        total += Convert.ToInt32(dr["valor"]);
    }

    // Total do último tipo....
    lvi = listView1.Items.Add(new ListViewItem(new string[] { "Total", total.ToString() }));
    lvi.Group = listView1.Groups[tipo];
    lvi.Font = bold;

    Abraços,
    Francisco
    OK, Computer - http://thespoke.net/blogs/fbcjunior/default.aspx

    sexta-feira, 12 de janeiro de 2007 16:04
    Moderador

Todas as Respostas

  • PDH,

    Coloque um ListView no seu form e o codigo abaixo no evento Load do seu aplicativo:

    Font bold = new Font(this.Font.FontFamily, this.Font.Size, FontStyle.Bold);
    listView1.View =
    View.Details;
    listView1.Columns.Add(
    "Descrição", 200);
    listView1.Columns.Add(
    "Valor", 100);
    listView1.Groups.Add(
    "Tipo1", "Tipo 1");
    listView1.Items.Add(
    new ListViewItem(new string[] { "aaaa", "10" })).Group = listView1.Groups["Tipo1"];
    listView1.Items.Add(
    new ListViewItem(new string[] { "bbbb", "10" })).Group = listView1.Groups["Tipo1"];
    listView1.Items.Add(
    new ListViewItem(new string[] { "cccc", "30" })).Group = listView1.Groups["Tipo1"];
    ListViewItem lvi = listView1.Items.Add(new ListViewItem(new string[] { "Total", "50" }));
    lvi.Group = listView1.Groups[
    "Tipo1"];
    lvi.Font = bold;

    listView1.Groups.Add(
    "Tipo2", "Tipo 2");
    listView1.Items.Add(
    new ListViewItem(new string[] { "eeee", "15" })).Group = listView1.Groups["Tipo2"];
    listView1.Items.Add(
    new ListViewItem(new string[] { "ffff", "15" })).Group = listView1.Groups["Tipo2"];
    listView1.Items.Add(
    new ListViewItem(new string[] { "gggg", "10" })).Group = listView1.Groups["Tipo2"];
    lvi = listView1.Items.Add(
    new ListViewItem(new string[] { "Total", "40" }));
    lvi.Group = listView1.Groups[
    "Tipo2"];
    lvi.Font = bold;

    Abraços,
    Francisco
    OK, Computer - http://thespoke.net/blogs/fbcjunior/default.aspx

    sexta-feira, 12 de janeiro de 2007 04:31
    Moderador
  • E ae Francisco, cara, gostei muito disso, ficou bem bacana mesmo.

    Sei que é pedir muito, mas como faço para ele ficar dinâmico, usando um query?

     

    Valew

    sexta-feira, 12 de janeiro de 2007 14:20
  • PDH,

    Bom, vai um exemplo a partir de um DataTable, supondo que todos os dados necessários estariam nesta tabela. Basta colocar o código no evento Load de um form com um ListView:

    // Vou usar uma fonte bold no total
    Font bold = new Font(this.Font.FontFamily, this.Font.Size, FontStyle.Bold);
    ListViewItem lvi = null;

    // ... e mostrar os dados como Details
    listView1.View = View.Details;
    listView1.Columns.Add(
    "Descrição", 200);
    listView1.Columns.Add(
    "Valor", 100);

    // Aí aqui vou criar uma base de dados de exemplo...
    DataTable dt = new DataTable();
    dt.Columns.Add(
    "tipo", typeof(string));
    dt.Columns.Add(
    "desc", typeof(string));
    dt.Columns.Add(
    "valor", typeof(int));
    dt.Rows.Add(
    new object[] { "Tipo 1", "aaaa", 10 });
    dt.Rows.Add(
    new object[] { "Tipo 1", "bbbb", 10 });
    dt.Rows.Add(
    new object[] { "Tipo 1", "cccc", 30 });
    dt.Rows.Add(
    new object[] { "Tipo 2", "eeee", 15 });
    dt.Rows.Add(
    new object[] { "Tipo 2", "ffff", 15 });
    dt.Rows.Add(
    new object[] { "Tipo 2", "gggg", 10 });

    // Isso aqui teoricamente não seria necessário, já
    // que eu criei os dados já ordenados por tipo. Mas
    // supondo que sua base de dados não esteja ordenada,
    // este seria o primeiro passa a ser feito
    dt.DefaultView.Sort = "tipo";
    string tipo = "";
    int total = 0;

    // Aí vou percorrendo linha a linha...
    foreach (DataRowView dr in dt.DefaultView)

        // Verifico se preciso criar o grupo, que no
        // caso seria o tipo do registro.
        if (tipo != dr["tipo"].ToString())
        {
            // Se for mudar de grupo, tem que pôr o total,
            // desde que não seja a primeira passagem por aqui...
            if (tipo != "")
            {
                lvi = listView1.Items.Add(
    new ListViewItem(new string[] { "Total", total.ToString() }));
                lvi.Group = listView1.Groups[tipo];
                lvi.Font = bold; 
           

            listView1.Groups.Add(dr[
    "tipo"].ToString(), dr["tipo"].ToString());
            tipo = dr[
    "tipo"].ToString();
            total = 0;
        }

        // Vou adicionando os itens...
        listView1.Items.Add(new ListViewItem(new string[] { dr["desc"].ToString(), dr["valor"].ToString() })).Group = listView1.Groups[tipo];

        // ... e somando o total.
        total += Convert.ToInt32(dr["valor"]);
    }

    // Total do último tipo....
    lvi = listView1.Items.Add(new ListViewItem(new string[] { "Total", total.ToString() }));
    lvi.Group = listView1.Groups[tipo];
    lvi.Font = bold;

    Abraços,
    Francisco
    OK, Computer - http://thespoke.net/blogs/fbcjunior/default.aspx

    sexta-feira, 12 de janeiro de 2007 16:04
    Moderador