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