Jak przekazać parametr do drugiej formy?

0

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?

0

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).

0

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.

0
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?

0

Albo tak jak T72 napisal, albo tworzysz konstruktor Form2(int numer) i tworzysz forme przez ten konstruktor, podajac w parametrach cell.value.

0
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.

0

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

0
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 ?

0

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

0

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.

0

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? ;)

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

To powinno byc w takim razie cell.Value.

0

Otworzylem juz ta druga forme a teraz jak przekazacparamter z powrotem podczas zamkniecia formy nr 2 ?

0

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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1