Hallo zusammen,
ich habe eine Form mit 3 Datagridviews. Jedes Grid hat seinen eigenen CellContentClick EventHandler womit ich GridButtonColumns handeln möchte wie z.b. löschen einer Row oder Sprung zu meinem anderem Modul. Das ganze sieht wie folgt aus:
private BindingList<ModelA> _modelA = getData(A);
private BindingList<ModelB> _modelB = getData(B);;
private BindingList<ModelC> _modelC = getData(C);;
private void WireUpForm()
{
dataGridView1.DataSource = _modelA ;
dataGridView2.DataSource = _modelB ;
dataGridView3.DataSource = _modelC ;
dataGridView1.CellContentClick += DgvOneOnCellContentClick;
dataGridView2.CellContentClick += DgvTwoOnCellContentClick;
dataGridView3.CellContentClick += DgvThreeOnCellContentClick;
}
private void DgvOneOnCellContentClick(object sender, DataGridViewCellEventArgs e)
{
var grid = sender as DataGridView;
if (e.RowIndex >= 0)
{
if (e.ColumnIndex == dgvOneDelete.Index)
{
var modelA = grid.CurrentRow.DataBoundItem;
DeleteModelA(modelA)
}
}
else if(e.ColumnIndex == dgvOneGoto.Index)
{
// Logik
}
}
private void DgvTwoOnCellContentClick(object sender, DataGridViewCellEventArgs e)
{
// Das gleiche wie oben mit anderem Typ
}
private void DeleteA(ModelA a)
{
_modelA.Remove(a);
}
private void DeleteB(ModelB b)
{
_modelB.Remove(b);
}
Das Problem ist jetzt, das ich viel gleichwertigen Code habe, also bin ich auf die Idee gekommen den Grids einen einzigen Eventhandler zuzuweißen. Das sieht dann wie folgt aus.
private void WireUpForm()
{
dataGridView1.CellContentClick += AllGridsOnCellContentClick;
dataGridView2.CellContentClick += AllGridsOnCellContentClick;
dataGridView3.CellContentClick += AllGridsOnCellContentClick;
}
private void AllGridsOnCellContentClick(object sender, DataGridViewCellEventArgs e)
{
var grid = sender as DataGridView;
if (e.RowIndex >= 0)
{
If (grid == dataGridView1)
{
if (e.ColumnIndex == dgvOneDelete.Index)
{
// siehe oben
}
}
If (grid == dataGridView2)
{
if (e.ColumnIndex == dgvTwoDelete.Index)
{
// siehe oben
}
}
}
Das sieht natürlich auch nicht wirklich toll aus.
Meine Frage diesbezüglich ist jetzt ob es eine Möglichkeit gibt dieses generisch zu implementieren ohne die ganzen If Else Bedienungen bzw. ob hier ein Pattern wie Strategy sinnvoll ist?
Was soll dgvOneDelete sein ?
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code