C# Foreach döngüsünde tanımlanmamış değişkeni de bulması

486759

Hectopat
Katılım
21 Nisan 2020
Mesajlar
1.123
Çözümler
7
Şimdi kısaca özetlemem gerekirse olay şundan ibaret. Altta bulunan bir xaml yapım var.

XML:
<stackpanel x:Name="NavbarStackPanel">
    <stackpanel x:Name="AppearanceStackPanel">
        <button x:Name="Appearance"/>
        <grid x:Name="AppearanceIsActive"/>
    </stackpanel>
    <stackpanel x:Name="LanguageStackPanel">
        <button x:Name="Language"/>
        <grid x:Name="LanguageIsActive"/>
     </stackpanel>
</stackpanel>

Şimdi ben istiyorum ki herhangi bir butonuna tıkladığımda, "NavbarStackPanel" içerisindeki tüm StackPanelleri arasın, bu aramış olduğu StackPanellerin içerisinde tekrar Gridleri arasın. Eğer grid ismi bastığım butonun ismi ve "IsActive" eşit ise (Örneğin Buton ismi Apperance, Grid ismi ApperanceIsActive) o gridin görünürlüğünü visible, eğer değil ise collapsed yapsın.

Kodum aynen şöyle:
C#:
        private void NavbarButton_Click(object sender, RoutedEventArgs e)
        {
            string parentName = ((Button)sender).Name;
            foreach (StackPanel stackPanel in NavbarStackPanel.Children)
            {
                foreach (Grid grid in stackPanel.Children)
                {
                    if (grid.Name == parentName + "IsActive")
                    {
                        grid.Visibility = Visibility.Visible;
                    }
                    else
                    {
                        grid.Visibility = Visibility.Collapsed;
                    }
                }
            }
        }

Gelen hata ise şu:
Kod:
System.InvalidCastException: 'Unable to cast object of type 'Windows.UI.Xaml.Controls.Button' to type 'Windows.UI.Xaml.Controls.Grid'.'

Fakat ben "foreach (Grid grid in stackPanel.Children)" kodu ile sadece stackPanel.Children içerisinde gridleri aratmış olmuyor muyum? Neden buttonları da sistem "grid" değişkene atıyor? Nerede hata yapıyorum, yardımcı olabilir misiniz?

Edit: Sanırsam bu foreach döngüsünde değişkenin türüne karar veremiyormuşuz. Yanlış biliyormuşum. Grid grid yazdığımda, ben Gridleri aratmış olmuyorum galiba UIElementler'i aratıp onların Grid olmasını sağlıyorum. Bu da sanırsam bulduğu buttonları Grid'e çevirmeye çalıştığından o yüzden hata alıyorum. Fakat ben nasıl stackpanel içerisinde sadece gridleri aratabilirim? typeof(Grid) ve GetType(Grid) tarzı kodlarda denememe rağmen çözüme ulaşamadım.

Çözüm:
C#:
foreach (UIElement element in stackPanel.Children)
                {
                    if (element is Grid grid)
                    {
                        if (grid.Name == parentName + "IsActive")
                        {
                            grid.Visibility = Visibility.Visible;
                        }
                        else
                        {
                            grid.Visibility = Visibility.Collapsed;
                        }
                    }
                }
 
Son düzenleyen: Moderatör:
Foreach parantezini şöyle değiştir yani Children'lerin sonuna OfType ekle:

C#:
foreach (StackPanel stackPanel in NavbarStackPanel.Children.OfType<StackPanel>())

foreach (Grid grid in stackPanel.Children.OfType<Grid>())
 
Foreach parantezini şöyle değiştir yani Children'lerin sonuna OfType ekle:

C#:
foreach (StackPanel stackPanel in NavbarStackPanel.Children.OfType<StackPanel>())

foreach (Grid grid in stackPanel.Children.OfType<Grid>())
Hocam sorunu yukarıdaki yapmış olduğum edit ile çözebildim fakat sizin dediğiniz yöntem UWP'de sanırsam geçerli olmuyor. OfType tanımlı olarak gözükmüyor. Sadece GetType tanımlı gözüküyor.

4.png
 
Bu yöntem WPF'de çalışıyor.
Şu kütüphane ekli olmalı: System.Linq
Evet hocam kodu kısaltmak amacıyla kütüphaneyi ekleyip denemek istedim fakat foreach ta geçerli olmuyor yine de.

Hata CS0446 Foreach 'yöntem grubu' üzerinde çalışamaz. 'yöntem grubu' öğesini çağırmayı mı istiyordunuz?

Bu arada yardımınız için yine de teşekkürler.
 

Geri
Yukarı