Search code examples
c#windows-phone

showing random grid c#


I have a problem to showing random a few grid in windows phone. I created my own code, it works fine but its not simple. Maybe there is a simpler way to show a random grid in windows phone.

This is what I need to my app:

I want to click a button to show a random grid. When I click again, it should show another grid and hide the previous grid. It should now show any grid twice.

This is my own code:

List<int> number = new List<int> { 1,2,3,4,5 }; //create list
private void Button_Click_2(object sender, RoutedEventArgs e)
{
    int numberrandom;
    Random bsd = new Random();
    if (number.Count > 0) // get random number from (numberlist) without repetition
    {
        int fIndex = bsd.Next(0, number.Count); 

        numberrandom = number[fIndex]; 
        txtbox1.Text = numberrandom.ToString(); // show random number at txtbox
        number.RemoveAt(fIndex);            
    }
    else 
    {
        messagebox.show("no more grid show");
    }

    int a = Convert.ToInt32(txtbox1.Text); // convert number txtbox from string to int
    int val = a;
    switch (val)
    {
        case 1: //show grid 1
            grid1.Visibility = Visibility.Visible; 
            grid2.Visibility = Visibility.Collapsed;
            grid3.Visibility = Visibility.Collapsed;
            grid4.Visibility = Visibility.Collapsed;
            grid5.Visibility = Visibility.Collapsed;
        break;
        case 2: //show grid 2
            grid1.Visibility = Visibility.Collapsed;
            grid2.Visibility = Visibility.Visible;
            grid3.Visibility = Visibility.Collapsed;
            grid4.Visibility = Visibility.Collapsed;
            grid5.Visibility = Visibility.Collapsed;
            break;
        case 3: //show grid 3
            grid1.Visibility = Visibility.Collapsed;
            grid2.Visibility = Visibility.Collapsed;
            grid3.Visibility = Visibility.Visible;
            grid4.Visibility = Visibility.Collapsed;
            grid5.Visibility = Visibility.Collapsed;
        break;
        case 4: //show grid 4
            grid1.Visibility = Visibility.Collapsed;
            grid2.Visibility = Visibility.Collapsed;
            grid3.Visibility = Visibility.Collapsed;
            grid4.Visibility = Visibility.Visible;
            grid5.Visibility = Visibility.Collapsed;
        break;
        case 5: //show grid 5
            grid1.Visibility = Visibility.Collapsed;
            grid2.Visibility = Visibility.Collapsed;
            grid3.Visibility = Visibility.Collapsed;
            grid4.Visibility = Visibility.Collapsed;
            grid5.Visibility = Visibility.Visible;
        break;
    }

Solution

  • There are a couple of improvements you can make:

    List<Grid> grids = new List<Grid> { grid1, grid2, grid3, gridN ... };
    int gridIndex = 0;
    
    void Load() {
        grids.Shuffle(); // use the extension method linked below
    }
    
    void Button_Click_2(object sender, RoutedEventArgs e) {
        if (gridIndex >= grids.Count)
            return;
    
        if (gridIndex > 0) {
            grids[gridIndex - 1].Visibility = Visibility.Collapsed;
        }
        grids[gridIndex].Visibility = Visibility.Visible;
        gridIndex++;
    }
    

    Do you need to display the original grid number? If not, the code above is much simpler. Here is the Shuffle() extension method, I got it from this answer:

    public static void Shuffle<T>(this IList<T> list)  
    {  
        Random rng = new Random();  
        int n = list.Count;  
        while (n > 1) {  
            n--;  
            int k = rng.Next(n + 1);  
            T value = list[k];  
            list[k] = list[n];  
            list[n] = value;  
        }  
    }