úterý 26. srpna 2008

.NET Zobrazní chyby v DataGridView

Při události CellValidating u DataGridView (DGV) je možné uživatele informovat o chybě několika způsoby.
  1. Klasicky, dialogovým okénkem MessageBox.Show(...).
  2. Nastavit chybu řádky dgv.Rows[e.RowIndex].ErrorText = "Chyba" (pozor, pak se tato chyba musí mazat při EndEdit()).
  3. Nastavit chybu buňky dgv.Rows[e.ColumnIndex, e.RowIndex].ErrorText = "Chyba". Ale chybový obrázek se neobjeví, pokud se buňka edituje. Workaround pro toto je třeba v DataGridView FAQ.
  4. Zobrazit ToolTip.
Bod 1. je asi nejjednodušší, ale ne moc uživatelsky přívětivý, protože se dialogové okénko s chybou musí odsouhlasit, aby zmizelo. Body 2. a 3. jsou často uváděné v příkladech nebo internetových diskusích. Sice se zobrazí pěkná červená blikající ikonka, ale uživatel na ní musí najet myší, aby se dověděl, co je špatně. Proto mi připadá nejlepší bod 4. - zobrazení ToolTipu. Uživatel hned vidí, jakou chybu způsobil a může ji ihned napravit. Navíc je to i poměrně jednoduché.


//deklarace
private ToolTip toolTip = new ToolTip();

...

// incializace, treba v konstruktoru
this.toolTip.ToolTipIcon = ToolTipIcon.Error;
this.toolTip.ToolTipTitle = Properties.Resources.TitleError;
this.dataGridView.CellEndEdit += new DataGridViewCellEventHandler(dataGridView_CellEndEdit);
this.dataGridView.CellValidating +=new DataGridViewCellValidatingEventHandler(dataGridView_CellValidating);

...

// Schovej tool tip po dokonceni editace.
void dataGridView_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
if (this.toolTip.Active)
{
this.toolTip.Hide(this);
}
}

private void dataGridView_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
{
...
if (error)
{
this.CellValidatingError(e, "Nastala chyba XYZ.");
return;
}
...
}

// Zobraz tooltip, pipni, nastav e.Cancel na true.
public void CellValidatingError(DataGridViewCellValidatingEventArgs e, string msg)
{
e.Cancel = true;
// tooltip
Rectangle cellBounds = this.dataGridView.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, true);
Point location = new Point(cellBounds.Left + this.dataGridView.Location.X, cellBounds.Bottom + this.dataGridView.Location.Y);
this.toolTip.Show(msg, this, location, 3000);
// beep
System.Media.SystemSounds.Beep.Play();
}


Poznámka: při ToolTip.Hide() a ToolTip.Show() se nastaví na prvek Control, ve kterém je DataGridView vložené, v tomto příkladě je to this.

Žádné komentáře: