The name 'dataGridView1' does not exist in the current context

0

Witam.
Jestem bardzo początkującą osobą jednak przygotowuje projekt i od kilku dni nie mogę ruszyć dalej.
Wstawiłem datagridview, podłączyłem się do bazy oracle i przygotowałem sobie wyszukiwarkę w takiej formie:

private void search_Click(object sender, EventArgs e)
{
    Oracle.ManagedDataAccess.Client.OracleConnection conn = new Oracle.ManagedDataAccess.Client.OracleConnection("User ID=BAZA;Password=MYPASSWORD;");
    Oracle.ManagedDataAccess.Client.OracleCommand cmd = new Oracle.ManagedDataAccess.Client.OracleCommand();

    DataSet ss = new DataSet();
    OracleDataAdapter ad = new OracleDataAdapter("select * from BAZA where MIEJSCOWOŚĆ like '" + textBox1.Text + "%' and IMIĘ like '" + textBox2.Text + "%' and NAZWISKO like '" + textBox3.Text + "%'", conn);
    ad.Fill(ss);
    dataGridView1.DataSource = ss.Tables[0];
}

Wszystko ładnie się wyszukuje jednak docelowo wyszukiwarka ma być w innym oknie. W drugim oknie jednak nie widzi datagridview i wywala błąd tak jak w tytule posta. Czy można to w jakiś sposób przerobić, coś dodać? Czytam i czytam ale nie potrafię sobie z tym poradzić.

Przepraszam jeśli piszę jak kretyn, dopiero się uczę.

dodanie znacznika <code class="csharp"> - furious programming

0
plpl napisał(a):

W drugim oknie jednak nie widzi datagridview i wywala błąd tak jak w tytule posta. Czy można to w jakiś sposób przerobić, coś dodać? Czytam i czytam ale nie potrafię sobie z tym poradzić.

Problem dotyczący przekazywania danych z jednego okna do drugiego powraca przeciętnie dwa razy tygodniowo.

  1. W klasie okna z gridem zrób publiczną metodę, która przyjmie dane do przeszukiwania.
  2. W klasie okna z wyszukiwarką zrób konstruktor przyjmujący w argumencie typ pierwszego okna i ustawiający pole tego typu.
  3. Pod przyciskiem wywołaj metodę z 1. punktu z danymi do wyszukania.

Tak poza tym, to ręczne pisanie ręczne SQL to zły pomysł, umieszczanie ich w klasie od okienka to pomysł bardzo nieelegancki, a sklejanie zapytań SQL przez zwykłą konkatenację to pomysł bardzo niebezpieczny. Poczytaj o SQL injection.

0

Dzięki za wskazówki. Znalazłem materiały, które w podobny sposób opisują problem ale nie mogę sobie z tym poradzić. Mógłby mi ktoś pomoc w napisaniu tego? Uczę się od tygodnia i gdybym po prostu nie musiał tego zrobić to sam pomału z podręcznikiem szukałbym rozwiązania. A nie mam za dużo czasu. Byłbym bardzo wdzięczny.

1

Najprościej. Główna forma.

namespace WindowsFormsApplication
{
   public partial class MainForm : Form
   {
      public MainForm()
      {
         InitializeComponent();
      }

      public DataTable GridDataSource
      {
         get { return dataGridView1.DataSource as DataTable; }
         set { dataGridView1.DataSource = value; }
      }

      private void search_Click(object sender, EventArgs e)
      {
         using (var form = new SearchForm(this))
         {
            form.ShowDialog();
            form.Close();
         }
      }
   }
}

Forma w której wyszukujesz.

namespace WindowsFormsApplication
{
   public partial class SearchForm : Form
   {
      private readonly MainForm _form;

      public SearchForm(MainForm form)
      {
         _form = form;
         InitializeComponent();
      }

      private void found_Click(object sender, EventArgs e)
      {
         /* SQL itd... */
         _form.GridDataSource = new DataTable(); /* Dane */
      }
   }
}
0

Część działa poprawnie ale dalej mam problem chyba z wyświetleniem wyników. Nie wiem jak odwołać się aby wyniki wyświetliło w tym datagridview1.

        {
            Oracle.ManagedDataAccess.Client.OracleConnection conn = new Oracle.ManagedDataAccess.Client.OracleConnection("User ID=BAZA;Password=MyPassword;");
            Oracle.ManagedDataAccess.Client.OracleCommand cmd = new Oracle.ManagedDataAccess.Client.OracleCommand();
            DataSet ss = new DataSet();
            OracleDataAdapter ad = new OracleDataAdapter("select * from BAZA where MIEJSCOWOŚĆ like '" + textBox1.Text + "%' and ULICA like '" + textBox2.Text + "%' and NUMER like '" + textBox3.Text + "%'", conn);
            _form.GridDataSource = new DataTable();
            _form.dataGridView1.DataSource = ss.Tables[0];
            ad.Fill(ss);
        }

Wyskakuje:

An unhandled exception of type 'System.IndexOutOfRangeException' occurred in System.Data.dll
Additional information: Nie można odnaleźć tabeli 0.

do wiersza:

_form.dataGridView1.DataSource = ss.Tables[0];

dodanie znacznika <code> - @furious programming

2

Widzę że bezmyślnie przekopiowałeś mój kod. ;)
Najpierw wypełniasz tabele danymi a później podpinasz do dataGridView nie na odwrót. Więc próbujesz odnieść się do nieistniejącego elementu w tabeli.
Mniej więcej to powinno wyglądać tak:

ad.Fill(ss);
_form.GridDataSource = ss.Tables[0];

A _form.dataGridView1.DataSource = ss.Tables[0]; to po co? W końcu uzupełniasz dataGridView1 poprzez _form.dataGridView1.DataSource czy _form.GridDataSource zdecyduj się. ;)

Jeszcze proponuje poczytać co to jest debbuger. Fajne narzędzie znacznie przyśpiesza pracę.

0

Hehe aż sam się z siebie śmieje. Teraz zależało mi na czasie. Po realizacji tego projektu będę miał czas żeby spokojnie usiąść do lektury :) obiecuje poprawić się ;)
Dzięki wielkie. Są jeszcze na świecie dobrzy ludzie ;)
Pozdrawiam

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