Popolare datagridviewcomboboxcolumn da codice

mercoledì 03 ottobre 2007 - 04.14

marcogio Profilo | Newbie

Ecco ill mio problema quotidiano,
Cerco di inserire una datagridviewcomboboxcolumn in un datagridview e di popolarla attraverso il codice. Quando compilo ricevo messaggio di errore (dataerror)
Sò che a design time debbo riempire alcune proprietà ed estrarre i campi da una tabella di database di appoggio, ma come detto , vorrei creare la nuova colonna a run time e popolare il combobox prendendo i dati da una lista utilizzando la proprietà items. Questo perchè poi vorrei variare i dati contenuti in una seconda datagridviewcomboboxcolumn in funzione della prima (tipo provincie - comuni).
Ho anche provato a costruire una colonna semplice ed a popolarla per esperimento, con successo.
Questo è il codice:

code
-------------------------------------------------------
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace WindowsApplication1
{

public partial class Form3 : Form

{
string stringadiconnessione, stringadiquery, stringadiquerytabellaAttivita,stringadiquerytabellaUffici;
SqlConnection cn;
SqlCommand cmID;
SqlDataAdapter da, databellaAttivita,databellaUffici;
SqlCommandBuilder cb,cbtabellaAttivita;
DataSet ds;
BindingSource bs,bstabellaAttivita,bstabellaUffici;



public Form3()
{
InitializeComponent();
}

private void Form3_Load(object sender, EventArgs e)
{
//creo le connessioni, i comandi, i dataadapter ed il dataset
stringadiconnessione = ".........";
stringadiquery = "SELECT * FROM tabellaPratiche";
stringadiquerytabellaAttivita = "SELECT * FROM tabellaAttivita";
cn = new SqlConnection(stringadiconnessione);
da = new SqlDataAdapter(stringadiquery, cn);
databellaAttivita = new SqlDataAdapter(stringadiquerytabellaAttivita, cn);
ds = new DataSet();

//carico nel dataset i dati delle due tabella
cn.Open();
da.FillSchema(ds, SchemaType.Source, "dtTabellaPratihe");
da.Fill(ds, "dtTabellaPratiche");
databellaAttivita.FillSchema(ds, SchemaType.Source, "dtTabellaAttivita");
databellaAttivita.Fill(ds, "dtTabellaAttivita");
cn.Close();

//creo una relazione nel dataset
DataColumn colonnaPratiche = ds.Tables["dtTabellaPratiche"].Columns["protocollo"];
DataColumn colonnaAttivita = ds.Tables["dtTabellaAttivita"].Columns["protocollo"];
DataRelation relazione = new DataRelation("PraticheAttivita", colonnaPratiche, colonnaAttivita);
ds.Relations.Add(relazione);

//creo i commandbuilder per tutte e due le tabelle
cb = new SqlCommandBuilder(da);
cbtabellaAttivita = new SqlCommandBuilder(databellaAttivita);

//creo il bindigSource per la tabella master
bs = new BindingSource();
bs.DataSource = ds;
bs.DataMember = "dtTabellaPratiche";

//creo il bindingSource per la tabella figlia
bstabellaAttivita = new BindingSource();
bstabellaAttivita.DataSource = bs;
bstabellaAttivita.DataMember = "PraticheAttivita";

//inserisco i dati, attraverso i bindingSource, nei datagridview
dataGridView1.DataSource = bs;
dataGridView2.DataSource = bstabellaAttivita;

modellaDataGridView1();
modellaDataGridView2();

cn.Open();
cmID = new SqlCommand("SELECT @@IDENTITY", cn);
cn.Close();

bs.Sort = "codUfficio,codFaldone";

da.RowUpdated += new SqlRowUpdatedEventHandler(da_RowUpdated);


}


void modellaDataGridView1()
{

//TUTTE LE COLONNE
dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
dataGridView1.DefaultCellStyle.WrapMode = DataGridViewTriState.True;
dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCellsExceptHeaders;

//COLONNA protocollo
dataGridView1.Columns["protocollo"].FillWeight = 25;
dataGridView1.Columns["protocollo"].HeaderText = "Prot.";
dataGridView1.Columns["protocollo"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;

//COLONNA pratica
dataGridView1.Columns["pratica"].FillWeight = 100;

//COLONNA codUfficio
dataGridView1.Columns["codUfficio"].FillWeight = 25;

//COLONNA ufficio
dataGridView1.Columns["ufficio"].HeaderText = "Ufficio";
dataGridView1.Columns["ufficio"].FillWeight = 50;

dataGridView1.Columns["codFaldone"].FillWeight = 25;

dataGridView1.Columns["faldone"].FillWeight = 50;

//COLONNA inizio
dataGridView1.Columns["inizio"].FillWeight = 50;
dataGridView1.Columns["inizio"].DefaultCellStyle.Format = "d";

//COLONNA fine
dataGridView1.Columns["fine"].FillWeight = 50;

//COLONNA combobox che contiene dati della colonna ufficio
DataGridViewTextBoxColumn miacolonna = new DataGridViewTextBoxColumn();
miacolonna.DataPropertyName = "ufficio";
miacolonna.Name = "ufficio3";
dataGridView1.Columns.Add(miacolonna);


DataGridViewComboBoxColumn colonnaComboBox = new DataGridViewComboBoxColumn();
//object[] uffici = new object[] { "626", "pg", "servizi", "sala radio", "fotogafico" };
//colonnaComboBox.Items.AddRange(uffici);
colonnaComboBox.Name = "ufficio2";
colonnaComboBox.DisplayIndex = 2; //la colonna verrà visualizzata al terzo posto
colonnaComboBox.FillWeight = 50;
colonnaComboBox.DataPropertyName= "ufficio";
//colonnaComboBox.DisplayMember = "ufficio";
//colonnaComboBox.ValueMember = "ufficio";
try
{
dataGridView1.Columns.Add(colonnaComboBox);//la colonna viene aggiunta alle altre
}
catch(Exception e)
{
MessageBox.Show(e.Message);
}


DataGridViewTextBoxColumn colonnadiprova = new DataGridViewTextBoxColumn();
colonnadiprova.Name="ufficio2";
colonnadiprova.HeaderText="ufficio II";
colonnadiprova.DataPropertyName="ufficio";
dataGridView1.Columns.Add(colonnadiprova);


DataGridViewCheckBoxColumn colonnaCheckBox = new DataGridViewCheckBoxColumn();
//colonnaCheckBox.DataPropertyName=;
dataGridView1.Columns.Add(colonnaCheckBox);
dataGridView1.Columns[9].FillWeight = 10;




}

void modellaDataGridView2()
{


}



}
}
-------------------------------------------------------

grazie di qualsiasi aiuto

freeteo Profilo | Guru

ciao,
io fare in questo modo:
- aggiungo le 2 colonne di tipo DataGridViewComboBoxColumn , per le province e i comuni
- riempio da codice (o anche fissi event) la colonna delle province
- nell'evento "cell Validated" della griglia controllo se l'utente sta' modificando la provincia
- se è cosi' vado a dare in pasto alla cella dei comuni i relativi comuni (filtrati)

cosi' facendo fai una sorta di master-details che vale per riga di datagridview.

Un codice d'esempio potrebbe essere questo:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

dove le 2 colonne si chiamano "provinciaColumn" e "comuneColumn" impostati da me nel design della griglia, e i comuni sono calcolati stupidamente con un array, ma nel tuo caso li caricherai da database o da dove vuoi insomma..
ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo

marcogio Profilo | Newbie

ho provato e riprovato senza successo.

L'unica cosa che sono riuscito a fare è scrivere il seguente codice:

code
...........................
dataGridView1.CellValidated += new DataGridViewCellEventHandler(dataGridView1_CellValidated);

}

void dataGridView1_CellValidated(object sender, DataGridViewCellEventArgs e)
{
string variabile;
variabile = (string)dataGridView1.Rows[e.RowIndex].Cells["ufficio"].FormattedValue;
etichetta.Text = variabile;


switch (variabile)
{
case "626":
{
bsTabellaFaldoni.RemoveFilter();
bsTabellaFaldoni.Filter = "ufficio = '626'";
}
break;
case "pg":
{
bsTabellaFaldoni.RemoveFilter();
bsTabellaFaldoni.Filter = "ufficio = 'pg'";
}
break;
default:
MessageBox.Show("la variabile non è supportata");
break;
}

..............................................

dove bsTabellaFaldoni è il BindingSource del secondo dataGridViewComboBoxColumn
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5