Znalezienie buttona po nazwie

Znalezienie buttona po nazwie

Wątek przeniesiony 2014-05-05 18:35 z C# i .NET przez somekind.

PI
  • Rejestracja: dni
  • Ostatnio: dni
0

Witam,
mam taki problem, potrzebuję znaleźć button po nazwie i następnie go wyłączyć lub włączyć.

Mam ArrayList w którym są przechowywane pobrane elementy z bazy danych.

Kopiuj
 
foreach (string s in alSym)
{
      if (s.ToString() == FindName(s).ToString())
      {
              Button bt = FindName(s) as Button;
              bt.IsEnabled=false;
}

W momencie uruchomienia zwraca wyjątek

Z góry dziękuję i pozdrawiam
PiK

msm
  • Rejestracja: dni
  • Ostatnio: dni
0

Ale jaki wyjątek? I gdzie? I co to jest FindName?

(i brakuje zamykającego nawiasu od ifa chyba że to błąd w kopiowaniu)

PI
  • Rejestracja: dni
  • Ostatnio: dni
0

Wyjątek A first chance exception of type 'System.NullReferenceException' occurred in XRDLCBR.exe
Odwołanie do obiektu nie zostało ustawione na wystąpienie obiektu.
FindName, jest to metoda systemowa która ma za zadanie wyszukać element po nazwie.

msm
  • Rejestracja: dni
  • Ostatnio: dni
1

Jeszcze nie napisałeś gdzie, w której linii. Takie rzeczy się zawsze podaje od razu.

W takim razie przeiteruje wszystkie możliwości:

Kopiuj
      if (s.ToString() == FindName(s).ToString())
      {
              Button bt = FindName(s) as Button;
              bt.IsEnabled=false;

Jeśli na s.ToString() -> s jest nullem
Jeśli na FindName(s).ToString() -> FindName(s) zwraca null (nie ma takiego elementu domyślam się).
Jeśli na bt.IsEnabled=false; -> FindName(s) nie zwraca Buttona.

PI
  • Rejestracja: dni
  • Ostatnio: dni
0

s.ToString() - nie jest null ("btnFilter")
FindName(s) - nie jest null ("btnFilter")
warunek jest spełniony, znajduję buttona który się nazywa btnFilter.
nie wiem jak mogę zmienić mu tą wartość bt.IsEnabled=false; i tu jest problem

somekind
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
0

Jakiego dokładnie typu jest obiekt btnFilter, i na jaki typ go rzutujesz za pomocą as?

KR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2520
0

Mam wrażenie, że bawicie się w czarnoksiężnictwo tutaj. Wklej więcej kodu jak chcesz pomocy, a nie karzesz zgadywać co zrobiłeś źle. Skąd się bierze alSym? Podaj kod FindName. Bez tego to jest jedno wielkie zgadywanie.

PI
  • Rejestracja: dni
  • Ostatnio: dni
0

Wklejam cały kod, muszę sprawdzić w bazie jak są ustawione prawa i włączyć lub wyłaczyć dany przycisk.
FindName jest metodą systemową Object.FrameworkElement.FindName(string name) btnFilter to nazwa jednego z przycisków.

Kopiuj
 
 public void vEnableAndDisableButtons()
        {
            SqlConnection sc = new SqlConnection(UserLogin.connectionString);
            SqlCommand cmd1, cmd2;
            SqlDataReader reader;

            ArrayList alSym = new ArrayList(); ;


            string sSelSym = "SELECT SYM FROM tAppOb";
            
            try
            {
                sc.Open();
                cmd1 = new SqlCommand(sSelSym, sc);
                reader = cmd1.ExecuteReader();

                while (reader.Read())
                {
                    alSym.Add(reader["SYM"].ToString().Trim());
                }
                sc.Close();

                foreach (string s in alSym)
                {
                    int nRght = 0;
                    sc.Open();
                    string sSelRght = "SELECT RGHT FROM tRght INNER JOIN tAppOB ON tAppOb.ID=tRght.OBJID WHERE SYM='"+s+"'";
                    cmd2 = new SqlCommand(sSelRght, sc);
                    nRght = Convert.ToInt32(cmd2.ExecuteScalar());
                    Console.WriteLine(FindName(s));
                    if (s.ToString() == FindName(s).ToString() && nRght == 0)
                    {

                        Button bt = FindName(s) as Button
                        bt.IsEnabled = true;
                       
                    }
                    else
                    {
                        
                        Button bt = FindName(s) as Button;
                        bt.IsEnabled = false;
                    }
                    sc.Close();
                }
            }
            catch (Exception ex)
            {
                Logger.Log(ex.Message);
                Debug.WriteLine(ex.Message);
                MessageBox.Show(ex.Message);
            }
        }

chcę porównać nazwy przycisków z nazwami zapisanymi w bazie i włączyć lub wyłączyć

somekind
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
0

Takie coś się nawet nie kompiluje. Podaj cały kod, łącznie z usingami, albo przynajmniej odpowiedz na moje poprzednie pytanie. Bo klas Button w .NET jest tysiąc, i może rzutujesz na nie taką, jakiej potrzebujesz.

I czemu używasz niewygodnego ArrayList zamiast np. List<string>?

PI
  • Rejestracja: dni
  • Ostatnio: dni
0

Poradziłem sobie

Kopiuj
 var myButton = (Button)this.FindName(s);

myButton.IsEnabled=false;

Dzięki za pomoc.

A co do ArrayList, użyłem gdyż w moim wypadku jest wystarczająca.

Pozdrawiam
PiK

msm
  • Rejestracja: dni
  • Ostatnio: dni
1

To:

Kopiuj
Button bt = FindName(s) as Button;

A to:

Kopiuj
var myButton = (Button)this.FindName(s);

To dokładnie to samo, tylko w drugim wypadku jest rzucany wyjątek jeśli obiekt rzutowany nie jest typu Button.

Tak czy inaczej, to wychodzi na to że tam był null czyli:

Jeśli na bt.IsEnabled=false; -> FindName(s) nie zwraca Buttona.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.