Moin,
ich habe ein DGV, mit ca 30 Columns was aus einer MySql-DB gefüllt wird.
Um weitere bearbeitungen anzustellen, verwende ich die erste Spalte als
invisible mit den DB-id's die ich dann ändern kann etc.
Mein Problem ist aber jetzt:
Ich habe testweise Labels unter meinem DGV wo
ich die sqlId der 1. Spalte und auch die Aktuelle Index des angeklickten Rows
angezeigt bekomme.
Wenn ich jetzt eine Row anklicke, zeigt er alles richtig an,
klicke ich eine weiter an geht es manchmal, aber umso schneller ich bin
bleibt manchmal die vorherige noch angezeigt.
Das ist unschön, wenn ich z.B. die 2. Zeile anklicke, diese auch Selektiert wird,
aber ich die falsche id lade....
Hier mein Click-Event:
private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
CommonClickBehavior(e.RowIndex);
}
private void CommonClickBehavior (int e)
{
if (dataGridViewKalkulieren.SelectedRows.Count == 1)
{
AktuelleZelleId = Convert.ToInt32(dataGridView1.Rows[e].Cells[0].Value);
AktuelleZelleIndex = e;
//... blabla
labelRowIndex.Text = AktuelleZelleIndex .ToString();
labelPosID.Text = AktuelleZelleId.ToString();
/* Daten in Ansicht Laden
* verschiedene Textboxen werden aus den Daten des
* DataGridView geladen
*/
return;
}
}
vermute ich das Richtig,
dass das Laden mehrer Textboxen zu dem Problem führt und
ich da mit einem BW arbeiten muss?
Hi,
nein - den Text mehrerer Textboxen festzulegen mit Daten die du bereits hast geht blitzschnell.
Ich vermute dein Fehler liegt in einem anderen Bereich - folgender Part wäre glaube ich interessanter:
/* Daten in Ansicht Laden
* verschiedene Textboxen werden aus den Daten des
* DataGridView geladen
LG
Also so in etwa werden noch Daten geladen:
tbPosNr.Text = dataGridView1.Rows[indexVonRow].Cells[2].Value.ToString();
tbKurztext.Text = dataGridView1.Rows[indexVonRow].Cells[4].Value.ToString();
richerTextBoxLangtext.Rtf = dataGridView1.Rows[indexVonRow].Cells[18].Value.ToString();
// Gesamtzeit ausgeben
decimal TageStunden = Convert.ToDecimal(dataGridView1.Rows[indexVonRow].Cells[12].Value.ToString());
string Tage = "0";
if (TageStunden > 8)
{
Tage = TageStunden.ToString("0,00");
}
lblGesamtzeit.Text = "Tage= " + Tage + " Stunden= " + dataGridView1.Rows[indexVonRow].Cells[12].Value.ToString();
tbMenge.Text = dataGridView1.Rows[indexVonRow].Cells[5].Value.ToString();
comboBoxEinheit.Text = dataGridView1.Rows[indexVonRow].Cells[7].Value.ToString();
tbGesamtpreis.Text = dataGridView1.Rows[indexVonRow].Cells[9].Value.ToString();
tbEp.Text = dataGridView1.Rows[indexVonRow].Cells[8].Value.ToString();
string PosArt = dataGridView1.Rows[indexVonRow].Cells[1].Value.ToString();
if (PosArt == "T")
{
tbMenge.ReadOnly = true;
tbEp.ReadOnly = true;
tbGesamtpreis.ReadOnly = true;
comboBoxEinheit.Visible = false;
}
else
{
tbMenge.ReadOnly = false;
tbEp.ReadOnly = false;
tbGesamtpreis.ReadOnly = false;
comboBoxEinheit.Visible = true;
}
Hi,
ich glaube ich weiß, was du meinst. Und es liegt nicht zwingend am zu schnell clicken.
Mit folgendem Beispiel lässt sich das bei mir schon reproduzieren - falls wir vom selben reden:
public partial class Form1 : Form
{
Random rndStr = new Random();
public Form1()
{
InitializeComponent();
dataGridView1.DataSource = GetData();
}
private List<DTO> GetData()
{
List<DTO> data = new List<DTO>();
//...
return data;
}
private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
CommonClickBehavior(e.RowIndex);
}
private void CommonClickBehavior(int e)
{
if (dataGridView1.SelectedRows.Count == 1)
{
var index = e;
var id = Convert.ToInt32(dataGridView1.Rows[e].Cells[0].Value);
var txt = dataGridView1.Rows[e].Cells[1].Value.ToString();
textBox1.Text = id.ToString();
textBox2.Text = txt;
return;
}
}
}
public class DTO
{
public int Value1 { get; set; }
public string Value2 { get; set; }
public DTO(int v1, string v2)
{
Value1 = v1;
Value2 = v2;
}
}
Das Thema ist eher folgendes: Bei Click auf eine nicht vollständig sichtbare Zeile - wird schlicht und ergreifend das Ereignis "CellClick" nicht geworfen, womit dann auch nichts aktualisiert wird.
Folgendes Event ist da offenkundig zuverlässiger:
private void dataGridView1_RowEnter(object sender, DataGridViewCellEventArgs e)
{
CommonClickBehavior(e.RowIndex);
}
LG
Warum so umständlich?
Das DataBinding per BindingSource macht das alles viel einfacher und vor allem muss man nicht auf irgendwelche Daten im DGV zugreifen.
Zumal man dann auch gleich die TextBoxen dadran binden kann, also fällt der ganze m... dann Weg.
public partial class Form1 : Form
{
Random rndStr = new Random();
BindingSource DtoBindingSource;
private DTO CurrentDTO
{
get{ return DtoBindingSource.Current as DTO;}
}
public Form1()
{
InitializeComponent();
dataGridView1.DataSource = GetData();
DtoBindingSource.PositionChanged += DtoBindingSource_PositionChanged;
}
private DtoBindingSource_PositionChanged(object sender, EventArgs e)
{
// was auch immer
}
private DtoBindingSource GetData()
{
List<DTO> data = new List<DTO>();
//...
if( DtoBindingSource != null )
DtoBindingSource.PositionChanged -= DtoBindingSource_PositionChanged;
DtoBindingSource = new BindingSource(data);
return DtoBindingSource;
}
}
Nur mal so runtergeschrieben.