Mam forme pierwsza na ktorej mam DataGridView i w tabeli mam 4 pola tekstowe i jedno pole IMAGE.
Chce zrobic tak ze po kliknieciu tylko na zdjecie otwiera sie nowa forma z powiekszana fotka.
Mam np 4 pola tekstowe: L.p. , Nazwa, Producent, Kod jak wychwycic zdarzenie poleghajace na kliknieciu akurat w kolumnie Image i przeslac kod do drugiej formy?
O ile zrozumialem dobrze, to prawdopodobnie pomoze Ci obsluga zdarzenia CellMouseClick, gdzie w danych zdarzenia mozesz sprawdzic np. index kliknietej kolumny (rozpoznasz, czy to ta z image'ami, czy nie).
A jak chodziło Ci o przekazywanie obrazka do tej drugiej formy to możesz np w formie drugiej zrobić zmienną publiczną np public string obrazek; i wtedy jak ją odpalasz robisz tak:
Form2 forma = new Form2();
forma.obrazek = nazwa_pliku;
forma.Show();
i w jakieś tam funkcji ( :) ) na Forma2 przy jej tworzeniu wczytujesz obrazek z podanej ścierzki.
johny_bravo napisał(a)
O ile zrozumialem dobrze, to prawdopodobnie pomoze Ci obsluga zdarzenia CellMouseClick, gdzie w danych zdarzenia mozesz sprawdzic np. index kliknietej kolumny (rozpoznasz, czy to ta z image'ami, czy nie).
Ok mam cos takiego:
private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
if (e.ColumnIndex == 2)
{
DataGridViewTextBoxCell cell = (DataGridViewTextBoxCell)
dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex];
MessageBox.Show(Convert.ToString(cell.Value));
Form2 Form2 = new Form2();
Form2.Show();
}
}
I teraz powiedzmy ze chce odpalic cos na formie 2 np zwykly textbox ktory bedzie zawieral cell.value jak to przekazac?
Albo tak jak T72 napisal, albo tworzysz konstruktor Form2(int numer) i tworzysz forme przez ten konstruktor, podajac w parametrach cell.value.
johny_bravo napisał(a)
Albo tak jak T72 napisal, albo tworzysz konstruktor Form2(int numer) i tworzysz forme przez ten konstruktor, podajac w parametrach cell.value.
No kumam ale jak napisal T72 to zakladam ze nazwa_pliku jest zdefioniowana w formie nr 1 i teraz jak ja uwidziec w formie 2.
No nie kumasz najwyrazniej. Tworzysz sobie w Form2 skladowa np. int numer; albo Image obrazek. Jezeli to public, to mozesz zrobic tak jak T72, czyli podstawic po prostu po stworzeniu obiektu Form2. Ja osobiscie zrobilbym private/protected i w konstruktorze przekazal wartosc i przypisal do odpowiedniej skladowej. Form2 oczywiscie widzi ta skladowa i jej wartosc, bo to przeciez skladowa tej klasy jest ;)
johny_bravo napisał(a)
No nie kumasz najwyrazniej. Tworzysz sobie w Form2 skladowa np. int numer; albo Image obrazek. Jezeli to public, to mozesz zrobic tak jak T72, czyli podstawic po prostu po stworzeniu obiektu Form2. Ja osobiscie zrobilbym private/protected i w konstruktorze przekazal wartosc i przypisal do odpowiedniej skladowej. Form2 oczywiscie widzi ta skladowa i jej wartosc, bo to przeciez skladowa tej klasy jest ;)
tzn teorie kumam ale praktycznie jak to zapisac (konstruktor) nie bardzo moge prosic o pare linijek przykladu ?
Klasycznie po utworzeniu formatki wyglada to tak:
public partial class Form1
{
public Form1()
{
InitializeComponent();
}
}
```
poniewaz to zwykla klasa, jak kazda inna, to mozesz zrobic tak:
public partial class Form1
{
private string MojePrywatnePole;
public Form1(string wartosc_przekazana)
{
InitializeComponent();
MojePrywatnePole = wartosc_przekazana;
}
//obsluga zdarzenia, jakas metoda, itp
{
MessageBox.Show(MojePrywatnePole);
}
}
Fajnie dzieki trybi ale natchnalem sie jeszcze na pole Image w Datagridview, bo teraz przeslalem sobie kod produktu jako tekst i laduje fote z dysku. Ale gdybym musial przeslac obrazek z pola Image Datagridview to mialbym:
private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
if (e.ColumnIndex == 1)
{
DataGridViewImageCell cell = (DataGridViewImageCell)dataGridView1.Rows[e.RowIndex].Cells [e.ColumnIndex];
dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex];
Form2 Form2 = new Form2(Convert.ToString(cell.Value));
Form2.Show();
}
}
I teraz jako parametr Form2 co nalezy podac? , gdzie teraz w cell jest fotka ?
Czyli majac teraz drugą forme i robie np:
PictureBox1.Image = ... ? // i tutaj co ?
Dzieki za odp.
No to tez musisz podac w parametrze w takim razie - czyli konstruktor typu Form2(int numer, Image obrazek). A fotka jest prawdopodobnie w value - jak ja tam wsadzales? ;)
while (reader.Read())
{
if (File.Exists("Sciezka/" + reader.GetString(3) + ".jpg"))
sciezka = "Sciezka/" + reader.GetString(3) + ".jpg";
else
sciezka = "Sciezka/brak.jpg";
fota = Image.FromFile(sciezka);
dataGridView1.Rows.Add(i, fota, reader.GetString(3), reader.GetString(16), reader.GetString(2), reader.GetString(8), reader.GetString(39), reader.GetString(11));
i++;
Application.DoEvents();
progressBar1.Value = i;
}
To powinno byc w takim razie cell.Value.
Otworzylem juz ta druga forme a teraz jak przekazacparamter z powrotem podczas zamkniecia formy nr 2 ?
Poprzez jakas publiczna skladowa/wlasciwosc. Np:
class Form2:System.Windows.Form
{
public String Result;
private String initValue;
public Form2(String value)
{
initValue =value;
}
//obsluga zdarzenia klikniecia OK, czy zamkniecia formularza, obojetne
...
{
if(costam)
Result = "wynik dzialania formatki";
else Result = null;
DialogResult = DialogResult.OK;
}
}
...
{
Form2 formatka = new Form2("poczatkowa wartosc");
if(formatka.ShowDialog() == DialogResult.OK)
String wartoscMnieInteresujaca = formatka.Result;
}
Ja to zazwyczaj robie w tym stylu wlasnie.