CARREGAR LISTVIEW C#
Olá, pode parecer repetitivo, mas o caso que não sei nada, nada de c# e vb.net , estou vindo do vb6, estou engatinhando. De forma que preciso iniciar com dois forms para aprender. Um normal de CADASTRO e um segundo que é executado por um button no primeiro form para selecionar funcionários pelo nome(listview com duas colunas apenas:código e nome) no evento dbclick de um listview que carrega os textbox do form de cadastro. Sendo assim, qual a maneira mais simples de se carregar um listview com dados do access 2007???.é claro achei [Ô]n[Ô] formas, mas não entendo como inserir no que eu já tenho, pois são várias strings, adapters, sql servers, readers, datatables cada um com uma particularidade.Segue minha conexão e o que já tenho para popular o listview.
//CLASSE CONEXÃO
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.OleDb;
using System.Windows.Forms;
namespace Promoções
{
class Conexao
{
private string caminhoBanco = @[Ô]Provider=Microsoft.ACE.OLEDB.12.0;Data Source=[Ô] + Application.StartupPath + @[Ô]\Promove.accdb[Ô];
/**
* Parametro SQL string para setar uma pesquisa no banco de dados
* Retorna Uma tabela com o resultado da pesquisa segundo o parametro SQL
* OBS: Ao instanciar este método, setar apenas SQL de SELECT
*/
public DataTable Pesquisar(String SQL)
{
DataTable tabela = new DataTable();
try
{
tabela.Rows.Clear();
OleDbConnection conn = new OleDbConnection(caminhoBanco);
conn.Open();
OleDbCommand comando = new OleDbCommand(SQL, conn);
OleDbDataAdapter adapter = new OleDbDataAdapter(comando);
adapter.Fill(tabela);
conn.Close();
}
catch (Exception Ex)
{
MessageBox.Show([Ô]Erro de Comando: [Ô] + Ex.Message);
}
return tabela;
}
/**
* Parametro SQL string para setar uma pesquisa no banco de dados
* OBS: Ao instanciar este método, setar apenas SQL de INSERT, UPDATE ou DELET
*/
public void Promo(string SQL)
{
try
{
OleDbConnection conn = new OleDbConnection(caminhoBanco);
conn.Open();
OleDbCommand comando = new OleDbCommand(SQL, conn);
comando.ExecuteNonQuery();
conn.Close();
}
catch (Exception Ex)
{
MessageBox.Show([Ô]Erro de Comando: [Ô] + Ex.Message);
}
}
}
}
-----------------------------------------------------------------------------
//PARA CARREGAR O LISTVIEW
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Collections;
using System.Data.OleDb;
namespace Promoções
{
public partial class frmSelFunc : Form
{
//private OleDbConnection conexaoBD;
private string arquivoDados;
private ArrayList tabelaArray;
private ArrayList camposArray;
public frmSelFunc()
{
InitializeComponent();
}
private void frmSelFunc_Load(object sender, EventArgs e)
{
// inicializa o ListView
// listView1.SmallImageList = imageList1;
listView1.Clear();
listView1.View = View.Details;
listView1.LabelEdit = false;
listView1.FullRowSelect = true;
listView1.GridLines = true;
PreencherListView(cmdBD); ------>>>>>Aqui para carregar os dados. E é onde o erro está apontando.
}
private void PreencherListView(OleDbConnection conn)
{
OleDbCommand cmdBD;
OleDbDataReader datReader;
string strCampo;
//define o nome da tabela
// txtTabela.Text = nomeTabela;
//define uma instrução SQL para obter os dados da tabela
strCampo = [Ô]SELECT * FROM tbFunc[Ô];
// Inicializa o objeto command
cmdBD = new OleDbCommand(strCampo, conn);
//abre a conexão e executa o command
conn.Open();
datReader = cmdBD.ExecuteReader();
// Preenche o ListView
while (datReader.Read())
{
ListViewItem objListItem = new ListViewItem(datReader.GetValue(0).ToString());
for (int c = 1; c < datReader.FieldCount; c++)
{
objListItem.SubItems.Add(datReader.GetValue(c).ToString());
}
//objListItem.ImageIndex = 5;
// listView1.Items.Add(objListItem);
}
//fecha o datareader e a conexao
datReader.Close();
conn.Close();
}
}
}
Obs: do jeito que tá acima dá erro de : [Ô]The name [ô]cmdBD[ô] does not exist in the current context[Ô]
é isso ai..
ALAN
//CLASSE CONEXÃO
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.OleDb;
using System.Windows.Forms;
namespace Promoções
{
class Conexao
{
private string caminhoBanco = @[Ô]Provider=Microsoft.ACE.OLEDB.12.0;Data Source=[Ô] + Application.StartupPath + @[Ô]\Promove.accdb[Ô];
/**
* Parametro SQL string para setar uma pesquisa no banco de dados
* Retorna Uma tabela com o resultado da pesquisa segundo o parametro SQL
* OBS: Ao instanciar este método, setar apenas SQL de SELECT
*/
public DataTable Pesquisar(String SQL)
{
DataTable tabela = new DataTable();
try
{
tabela.Rows.Clear();
OleDbConnection conn = new OleDbConnection(caminhoBanco);
conn.Open();
OleDbCommand comando = new OleDbCommand(SQL, conn);
OleDbDataAdapter adapter = new OleDbDataAdapter(comando);
adapter.Fill(tabela);
conn.Close();
}
catch (Exception Ex)
{
MessageBox.Show([Ô]Erro de Comando: [Ô] + Ex.Message);
}
return tabela;
}
/**
* Parametro SQL string para setar uma pesquisa no banco de dados
* OBS: Ao instanciar este método, setar apenas SQL de INSERT, UPDATE ou DELET
*/
public void Promo(string SQL)
{
try
{
OleDbConnection conn = new OleDbConnection(caminhoBanco);
conn.Open();
OleDbCommand comando = new OleDbCommand(SQL, conn);
comando.ExecuteNonQuery();
conn.Close();
}
catch (Exception Ex)
{
MessageBox.Show([Ô]Erro de Comando: [Ô] + Ex.Message);
}
}
}
}
-----------------------------------------------------------------------------
//PARA CARREGAR O LISTVIEW
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Collections;
using System.Data.OleDb;
namespace Promoções
{
public partial class frmSelFunc : Form
{
//private OleDbConnection conexaoBD;
private string arquivoDados;
private ArrayList tabelaArray;
private ArrayList camposArray;
public frmSelFunc()
{
InitializeComponent();
}
private void frmSelFunc_Load(object sender, EventArgs e)
{
// inicializa o ListView
// listView1.SmallImageList = imageList1;
listView1.Clear();
listView1.View = View.Details;
listView1.LabelEdit = false;
listView1.FullRowSelect = true;
listView1.GridLines = true;
PreencherListView(cmdBD); ------>>>>>Aqui para carregar os dados. E é onde o erro está apontando.
}
private void PreencherListView(OleDbConnection conn)
{
OleDbCommand cmdBD;
OleDbDataReader datReader;
string strCampo;
//define o nome da tabela
// txtTabela.Text = nomeTabela;
//define uma instrução SQL para obter os dados da tabela
strCampo = [Ô]SELECT * FROM tbFunc[Ô];
// Inicializa o objeto command
cmdBD = new OleDbCommand(strCampo, conn);
//abre a conexão e executa o command
conn.Open();
datReader = cmdBD.ExecuteReader();
// Preenche o ListView
while (datReader.Read())
{
ListViewItem objListItem = new ListViewItem(datReader.GetValue(0).ToString());
for (int c = 1; c < datReader.FieldCount; c++)
{
objListItem.SubItems.Add(datReader.GetValue(c).ToString());
}
//objListItem.ImageIndex = 5;
// listView1.Items.Add(objListItem);
}
//fecha o datareader e a conexao
datReader.Close();
conn.Close();
}
}
}
Obs: do jeito que tá acima dá erro de : [Ô]The name [ô]cmdBD[ô] does not exist in the current context[Ô]
é isso ai..
ALAN
Alan, para começar, esqueça o Oledb e trabalhe com ado.net.
Existem várias formas de preencher uma listview, o mais indicado é utilizando orientação a objetos.
Você pode criar uma simples classe com os atributos dos clientes.
Agora em um botão
Existem várias formas de preencher uma listview, o mais indicado é utilizando orientação a objetos.
Você pode criar uma simples classe com os atributos dos clientes.
class ClsCliente
{
public int codigo { get; set; }
public string nome { get; set; }
public string cpf { get; set; }
public ClsCliente(int _codigo, string _nome, string _cpf)
{
this.codigo = _codigo;
this.nome = _nome;
this.cpf = _cpf;
}
}
Agora em um botão
private void button1_Click(object sender, EventArgs e)
{
listView1.Items.Clear();
listView1.Columns.Clear();
listView1.Columns.Add([Ô]Cliente[Ô]);
listView1.Columns.Add([Ô]Nome[Ô]);
listView1.Columns.Add([Ô]CPF[Ô]);
listView1.View = View.Details;
List<ClsCliente> clientes = new List<ClsCliente>();
clientes.Add(new ClsCliente(1,[Ô]JOAO[Ô],[Ô]0000000001[Ô]));
clientes.Add(new ClsCliente(2, [Ô]JOSE[Ô], [Ô]0000000002[Ô]));
clientes.Add(new ClsCliente(3, [Ô]MARIA[Ô], [Ô]0000000003[Ô]));
Int32 itemAtual = 0;
foreach (var cliente in clientes)
{
listView1.Items.Add(cliente.codigo.ToString());
listView1.Items[itemAtual].SubItems.Add(cliente.nome);
listView1.Items[itemAtual].SubItems.Add(cliente.cpf);
itemAtual += 1;
}
}
GUIMORAES123, no trecho do código abaixo tu inseriu manualmente os dados do listview. Como fica para acessar do banco?Qual o exemplo de uma conexão e de uma string para selecionar os dados da tabela????
List<ClsCliente> clientes = new List<ClsCliente>();
clientes.Add(new ClsCliente(1,[Ô]JOAO[Ô],[Ô]0000000001[Ô]));
clientes.Add(new ClsCliente(2, [Ô]JOSE[Ô], [Ô]0000000002[Ô]));
clientes.Add(new ClsCliente(3, [Ô]MARIA[Ô], [Ô]0000000003[Ô]));
ALAN
List<ClsCliente> clientes = new List<ClsCliente>();
clientes.Add(new ClsCliente(1,[Ô]JOAO[Ô],[Ô]0000000001[Ô]));
clientes.Add(new ClsCliente(2, [Ô]JOSE[Ô], [Ô]0000000002[Ô]));
clientes.Add(new ClsCliente(3, [Ô]MARIA[Ô], [Ô]0000000003[Ô]));
ALAN
Olá alan
A sua classe de conexão já tem método de pesquisa e funciona melhor com um DataGridView do que com um ListView:
Troca sua listview por um datagridview
daà sua codificação ficaria assim:
Isso é só pra vc ver como seu código fica bem mais enxuto com uma classe separadamente. E se vc quizer que o cabeçalho de cada coluna apareça com um texto diferente, é só modificar o sql tipo assim:
e assim vai. Daà pra frente é só vc brincar com SQL!
Té mais
A sua classe de conexão já tem método de pesquisa e funciona melhor com um DataGridView do que com um ListView:
Troca sua listview por um datagridview
daà sua codificação ficaria assim:
private void frmSelFunc_Load(object sender, EventArgs e)
{
DataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect; //essa linha fica melhor no método construtor na minha opinião
PreencherGRID([Ô]SELECT * FROM tbFunc[Ô] );// dentro do parenteses vai o código SQL como parametro pro método PreencherGRID que está logo abaixo
}
private void PreencherGRID(string SQL)
{
Conexao conn = new Conexao();//instancia da classe
DataGridView1.DataSource = conn.Pesquisar(SQL);//aqui seu datagrid já é populado com o resultado do SQL passado como parametro
}
Isso é só pra vc ver como seu código fica bem mais enxuto com uma classe separadamente. E se vc quizer que o cabeçalho de cada coluna apareça com um texto diferente, é só modificar o sql tipo assim:
[Ô]SELECT codFunc AS Código, nomeFunc AS Nome, cpfFunc AS CPF FROM tbFunc[Ô]
e assim vai. Daà pra frente é só vc brincar com SQL!
Té mais
string sql = [Ô][Ô];
sql = [Ô]Select codigo, nome, cpf[Ô];
sql += [Ô] from clientes[Ô];
SqlCommand cmd = new SqlCommand(sql, conexao);
SqlDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
clientes.Add(new ClsCliente(Convert.ToInt32(dr[[Ô]codigo[Ô]]), dr[[Ô]nome[Ô]].ToString(), dr[[Ô]CPF[Ô]].ToString()));
}
Só mais uma observação
Quando vc for selecionar os registros e trocar o valor do cabeçalho, e se esse cabeçalho contiver mais de uma palavra, coloque-as entre aspas simples assim:
[Ô]SELECT dnFunc AS[txt-color=#e80000] [ô]Data de Nascimento[ô] [/txt-color]FROM tbFunc[Ô]
Té mais
Quando vc for selecionar os registros e trocar o valor do cabeçalho, e se esse cabeçalho contiver mais de uma palavra, coloque-as entre aspas simples assim:
[Ô]SELECT dnFunc AS[txt-color=#e80000] [ô]Data de Nascimento[ô] [/txt-color]FROM tbFunc[Ô]
Té mais
ACCIOLLY, no vb6 eu sempre gostei muito do ListView, mas os tempos mudam: novos controles, novas linguagens, portanto vou ver se começo a me acostumar com o dataGridView.Adaptei o código acima e funcionou, puxou os dados do banco.
Só mais uma pergunta: no mesmo form é possÃvel por um txt e na medida que o usuário vai digitando também vai filtrando como no listview???
Só mais uma pergunta: no mesmo form é possÃvel por um txt e na medida que o usuário vai digitando também vai filtrando como no listview???
Sem dúvida!
vc pode trabalhar com eventos do textbox, mas eu particularmente prefiro colocar um botão ao lado do textbox pra fazer a pesquisa ao invés de usar o evento change.
independente se vc vai usar o evento change do textbox ou apenas o botão a codificação é sempre a mesma, só modificando o sql:
se colocar essa simples linha no evento change ou apenas no evento click do botão já vai funcionar.
Té mais
vc pode trabalhar com eventos do textbox, mas eu particularmente prefiro colocar um botão ao lado do textbox pra fazer a pesquisa ao invés de usar o evento change.
independente se vc vai usar o evento change do textbox ou apenas o botão a codificação é sempre a mesma, só modificando o sql:
PreencherGRID([Ô]SELECT * FROM tbFunc WHERE nomeFunc LIKE [ô][Ô] + textbox1.text + [Ô]%[ô] [Ô] );
se colocar essa simples linha no evento change ou apenas no evento click do botão já vai funcionar.
Té mais
é isso ai pessoal, a partir de agora é comigo. Obrigado pela força. Por aqui até o momento tá funcionando...até mais...
Tópico encerrado , respostas não são mais permitidas