CARREGAR LISTVIEW C#

ALANTB 10/09/2015 10:00:20
#451212
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
GUIMORAES 10/09/2015 11:06:59
#451216
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.

  

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;
}

}
ALANTB 10/09/2015 11:13:54
#451217
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
ACCIOLLY 10/09/2015 11:20:24
#451218
Resposta escolhida
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:

 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
GUIMORAES 10/09/2015 11:29:47
#451219
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()));
}
ACCIOLLY 10/09/2015 11:51:42
#451223
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
ALANTB 10/09/2015 11:53:15
#451224
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???
ACCIOLLY 10/09/2015 12:03:55
#451225
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:

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
ALANTB 10/09/2015 12:46:22
#451227
é 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