Dopo svariati tentativi ho optato per la soluzione con una combo esterna.
La combo è settata non visibile a design-time.
Posto il codice dell'evento Click sul DataViewGrid che rende visibile la combo e quello
relativo all'uscita dalla combo che imposta il valore della Cella sottostante.
codice:
.....
this.cboDescrizione.Leave += new System.EventHandler(this.cboDescrizioneLeave);
.....
this.grdWPreventivo.CellEnter += new System.Windows.Forms.DataGridViewCellEventHandler(this.GrdWPreventivoCellContentClick);
this.grdWPreventivo.CellContentClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.GrdWPreventivoCellContentClick);
.....
.....
private void GrdWPreventivoCellContentClick(object sender, System.Windows.Forms.DataGridViewCellEventArgs e)
{
DataGridView grd = this.grdWPreventivo;
Rectangle rect = grd.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, false);
if (e.ColumnIndex==0) {
RigaCorrente = e.RowIndex;
blEditing = true;
// -------------------------------------
// Set combo absolute position
// -------------------------------------
cboDescrizione.Left = rect.X + grd.Left;
cboDescrizione.Top = rect.Y + grd.Top;
cboDescrizione.BringToFront();
} else
blEditing = false;
// ---------------------------------------
// Set combo visible, so can receive focus
// ---------------------------------------
cboDescrizione.Visible = blEditing;
// -----------------------------------------
// Can combo receive Focus() ?
// -----------------------------------------
if (blEditing) cboDescrizione.Focus();
}
private void cboDescrizioneLeave(object sender, System.EventArgs e)
{
// -----------------------------------
// Stop editing. Start CellValidating.
// -----------------------------------
string valore = cboDescrizione.Text;
blEditing = false;
this.grdWPreventivo.Rows[RigaCorrente].Cells[0].Value = valore;
cboDescrizione.SendToBack();
cboDescrizione.Visible = false ;
int i = this.cboDescrizione.FindString(cboDescrizione.Text);
if (i==-1) cboDescrizione.Items.Add(cboDescrizione.Text);
}
Riporto le considerazioni generali sul codice postato :
1) La soluzione proposta non è l'unica possibile.
2) Non è la più performante ne quella maggiormente ottimizzata.
3) Rappresenta un ragionevole compromesso tra la semplicità del codice e il
raggiungimento del risultato.
4) Nel tempo si potrà scoprire una soluzione migliore, probabilmente già esistente.