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

Znalezienie buttona po nazwie

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.

 
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

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)

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.

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:

      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.

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

0

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

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.

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.

 
 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ć

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

0

Poradziłem sobie

 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

1

To:

Button bt = FindName(s) as Button;

A to:

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.

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