Mam taki nietypowy problem mianowicie mam 3 dataGridView ale zawęziłem to do 2 bo chodzi o to samą zasadę działania. Mianowicie chcę by przed edycją pola Ilość w dataGridView3 pobierało mi wartość do pamięci następnie wyszukiwało datę edytowanej wartości i wyszukiwało taką samą w dataGridView1. Następnie przy zakończonej edycji sprawdza czy wpisana wartośść nie jest większa od wartości w dataGridView1.
Może na przykładzie:
dgv1:
2016-07-01 | 150

dgv3:
2016-07-01 | 40

gdy kliknę na wierszu dgv3 pobiera mi wartość 40 do pamięci. Wpisuje np. 60. System wyszukuje daty 2016-07-01 w dgv1 i sprawdza czy wpisana wartość < a niżeli 150. Tutaj jest mniejsza i pozwala wpisać 60. Jeśli byłaby większa to zwraca msGBx że za duża wartość i zwraca 40 z pamięci do komórki.

Wszystko mi udało osiągnąć ale jest jeden mały problem wystarczy zamiast dwukliku kliknąć raz myszką i przytrzymać dłużej klawisz i wchodzi do edycji i można wpisać wartość jaką się chce nawet 40000 i dgv3 przyjmie to. Nie wiem jak się pozbyć możliwości włączenia trybu edycji dla dłuższego przytrzymania klawiszy myszki.
Z góry dziękuję za pomoc:


        private void Form1_Load(object sender, EventArgs e)
        {
            dataGridView1.Columns.Add(("Data").ToString(), ("Data").ToString());
            dataGridView1.Columns.Add(("Ilość Total").ToString(), ("Ilość Total").ToString());
            dataGridView1.Rows.Add("2018-05-01", "345");
            dataGridView1.Rows.Add("2018-06-01", "221");
            dataGridView1.Rows.Add("2018-07-01", "145");
            dataGridView1.Rows.Add("2018-08-01", "342");
            dataGridView1.Columns[0].ReadOnly = true;
            dataGridView1.Columns[1].ReadOnly = true;

            dataGridView2.Columns.Add(("Data").ToString(), ("Data").ToString());
            dataGridView2.Columns.Add(("Ilość 1").ToString(), ("Ilość 1").ToString());
            dataGridView2.Rows.Add("2018-05-01", "145");
            dataGridView2.Rows.Add("2018-06-01", "121");
            dataGridView2.Rows.Add("2018-07-01", "45");
            dataGridView2.Rows.Add("2018-08-01", "33");
            dataGridView2.Columns[0].ReadOnly = true;
            dataGridView2.Columns[1].ReadOnly = true;

            dataGridView3.Columns.Add(("Data").ToString(), ("Data").ToString());
            dataGridView3.Columns.Add(("Ilość 2").ToString(), ("Ilość 2").ToString());
            dataGridView3.Rows.Add("2018-05-01", "12");
            dataGridView3.Rows.Add("2018-06-01", "23");
            dataGridView3.Rows.Add("2018-07-01", "43");
            dataGridView3.Rows.Add("2018-08-01", "55");
            dataGridView3.Columns[0].ReadOnly = true;
            dataGridView3.Columns[1].ReadOnly = true;
        }

        public double ilosc_org;
        int tylko_raz = 0;

        public double roznica;
        private void dataGridView3_CellEndEdit(object sender, DataGridViewCellEventArgs e)
        {
            if (tylko_raz == 0)
            {

                double ilosc_koryg = Convert.ToDouble(dataGridView3.Rows[e.RowIndex].Cells[1].Value.ToString());

                string data_edit = (dataGridView3.Rows[e.RowIndex].Cells[0].Value.ToString());
                double ilosc = Convert.ToDouble(dataGridView3.Rows[e.RowIndex].Cells[1].Value.ToString());

                int czy_miesci_sie_w_total = 0;

                //szukanie identycznej daty w datagriedView1 i zwrócenie ilości

                for (int z = 0; z < dataGridView1.Rows.Count; z++)
                {
                    try
                    {
                        if (dataGridView1.Rows[z].Cells[0].Value.ToString() == data_edit && tylko_raz == 0)
                        {

                            czy_miesci_sie_w_total = Convert.ToInt32(dataGridView1.Rows[z].Cells[1].Value);

                            if (ilosc > czy_miesci_sie_w_total)
                            {
                                MessageBox.Show("Nie mieści się w total " + (czy_miesci_sie_w_total - ilosc));
                                dataGridView3.Rows[e.RowIndex].Cells[1].Value = ilosc_org;
                                tylko_raz = 1;
                            }
                            else
                            {
                                MessageBox.Show("Mieści się w total " + (czy_miesci_sie_w_total - ilosc));
                                tylko_raz = 1;
                            }

                        }
                    }
                    catch (Exception ex)
                    {

                    }
                }
                tylko_raz = 1;
            }
            tylko_raz = 1;
        }

        private void dataGridView3_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            ilosc_org = Convert.ToDouble(dataGridView3.Rows[e.RowIndex].Cells[1].Value.ToString());

            tylko_raz = 0;
            dataGridView3.Columns[1].ReadOnly = false;
        }

W załączeniu dałem projekt na szybko zrobiony by to przetestować organoleptycznie jakby ktoś mógł rzucić na to fachowym okiem:
http://212.59.240.9/testappdgv.zip