Laden...

Frage zum DGV Click-Events - Zeitverzögerung ?

Erstellt von schorge vor 8 Jahren Letzter Beitrag vor 8 Jahren 1.184 Views
S
schorge Themenstarter:in
129 Beiträge seit 2014
vor 8 Jahren
Frage zum DGV Click-Events - Zeitverzögerung ?

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?

1.029 Beiträge seit 2010
vor 8 Jahren

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

S
schorge Themenstarter:in
129 Beiträge seit 2014
vor 8 Jahren

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;
            }

1.029 Beiträge seit 2010
vor 8 Jahren

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

F
10.010 Beiträge seit 2004
vor 8 Jahren

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.

S
schorge Themenstarter:in
129 Beiträge seit 2014
vor 8 Jahren

danke @Taipi88
es funktioniert jetzt ohne Zeitverzögerung
mit RowEnter!