Usuário com melhor resposta
Agrupar Winform

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.
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
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 -
-
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