使用C#在Windows应用程序的数据网格视图中随机显示数据

时间:2014-04-10 03:07:51

标签: c# winforms

我正在进行一项小任务,我需要在10行10列的数据网格视图中随机显示数据(0到99 - 确保显示所有数字)。我无法弄清楚需要为这种情况编写的逻辑。目前我正在做如下所示,两个用于循环,一个用于行和其他列并迭代它......

        int[] arr = new int[] { 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 58, 69, 60, 61, 62, 63, 64 };
        char c = Convert.ToChar(arr.GetValue(new Random().Next(0, 21)));

        for (int row = 0; row < 10; row++)
        {
            for (int col = 0; col < 10; col++)
            {
                if ((row + col) == 9)
                {
                    this.dataGridView1.Rows[row].Cells[col].Value = string.Format("{0}     {1}", c, ((row + 1) * 9));
                }
                else
                {
                    this.dataGridView1.Rows[row].Cells[col].Value = string.Format("{0}     {1}", Convert.ToChar(arr.GetValue(new Random().Next(0, 21))), row * 10 + (col));
                    System.Threading.Thread.Sleep(15);
                }
            }
        }

Out put:

Data Grid View Output

预期:

将数字从0到99随机分配的代码。

先谢谢。

3 个答案:

答案 0 :(得分:2)

通过小型作业你的意思是学校作业吗?如果是这样,我不想为你写一切,而是指出你正确的方向:

第一步我将初始化一个大小为100的数组,并将数字0-99放在数组上。然后,我会找到一个用于改组数组的方法(Linq的OrderBy与Random类一起使用对你来说可能对你有用)。然后,我将遍历洗牌数组,并将这些项放在网格中。我认为你有一般的网格循环思想,嵌入式for循环......但我不确定线程​​睡眠的重点是什么。

答案 1 :(得分:0)

如果您没有完成编码,请检查一下......

protected void Button1_Click(object sender, EventArgs e)
{        
    DataTable dt = new DataTable();
    for (int i = 0; i < 10; i++)
        dt.Columns.Add("col" + i.ToString(), typeof(int));

    Random r = new Random();
    List<int> l = new List<int>(100);
    int temp=0;
    for (int i = 9; i >= 0; i--)
    {
        DataRow dr = dt.NewRow();
        for (int j = 0; j < 10; j++)
        {
            temp = r.Next(99);
            if (!l.Contains(temp) || (j == 0 && i == 0))
            {
                dr["col" + j.ToString()] = temp;
                l.Add(temp);
            }
            else
                j -= 1;
        }
        dt.Rows.Add(dr);
    }
    GridView1.DataSource = dt;
    GridView1.DataBind();
}

答案 2 :(得分:0)

这是我终于能够做到的。它工作!!!

public static class ThreadSafeRandom
{
    [ThreadStatic]
    private static Random Local;

    public static Random ThisThreadsRandom
    {
        get { return Local ?? (Local = new Random(unchecked(Environment.TickCount * 31 + Thread.CurrentThread.ManagedThreadId))); }
    }
}

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

上面的代码对数字进行了改组。

        var numbers = new List<int>(Enumerable.Range(0, 100));
        numbers.Shuffle();
        List<int> final = numbers.GetRange(0, 100);                                   

        int[,] f = new int[10, 10];

        for (int i = 0; i < 10; i++)
        {
            for (int j = 0; j < 10; j++)
            {
                f[i, j] = final[(i * 10) + j];                    
            }
        }

        for (int i = 0; i < 10; i++)
        {
            for (int j = 0; j < 10; j++)
            {
                if (f[i, j] % 9 == 0)
                {
                    this.dataGridView1.Rows[i].Cells[j].Value = string.Format("{0}     {1}", charSymbol, f[i, j]);
                }
                else
                {
                    this.dataGridView1.Rows[i].Cells[j].Value = string.Format("{0}     {1}", GetRandomChar(), f[i, j]);                       
                }
            }
        }