0

我需要在 MessageBox 的作业中显示一个转置的学生成绩数组。我有转置数组部分,但我需要消息框有行和列标签。

现在输出 MessageBox 只显示一个 3 行 x 5 列的成绩矩阵:

    decimal[,] decGrades = { { 87m, 88m, 89m },
                             { 90m, 95m, 100m },
                             { 70m, 80m, 90m },
                             { 50m, 50m, 50m },
                             { 80m, 92m, 94m } };

        string[] strStudentNames = { "Adams", "Benson", "Carson", 
  "Daley", "Edwards" };
        string[] strAssignmentNames = { "HW1", "HW2", "Exam1" };




    private decimal[,] TransposeMatrix(decimal[,] newArray)
    {
        decimal[,] TransposedArray = new decimal[newArray.GetLength(1), 
    newArray.GetLength(0)];
        for (int column = 0; column < newArray.GetLength(1); column++)
        {
            for (int row = 0; row < newArray.GetLength(0); row++)
            {
                TransposedArray[column, row] = newArray[row, column];

            }
        }
        return TransposedArray;
    }




    private void BtnTranspose_Click(object sender, EventArgs e)
    {
        decGrades = TransposeMatrix(decGrades);

        ////CODE TO SEND GRADES ARRAY TO MESSAGE BOX
        string gradesString = "";



        for (int i = 0; i < decGrades.GetLength(0); i++)
        {
            for (int j = 0; j < decGrades.GetLength(1); j++)
            {
                gradesString += decGrades[i, j] + " ";
            }

            gradesString += "\n";
        }

        MessageBox.Show(gradesString, "Transposed Array");

我似乎无法弄清楚如何将 strStudentNames 中的字符串数组值显示为列标签,将 strAssignmentNames 显示为行标签。

我非常感谢我能得到的任何帮助。谢谢!

4

1 回答 1

0

你可以试试这个:

private void BtnTranspose_Click(object sender, EventArgs e)
{
  var matrix = TransposeMatrix(decGrades);

  // Create a form
  var form = new Form();
  form.Text = "Transposed Array";
  form.Size = new Size(500, 400);
  form.StartPosition = FormStartPosition.CenterParent;

  // Create a list view
  var listview = new ListView();
  listview.Dock = DockStyle.Fill;
  listview.View = View.Details;
  listview.FullRowSelect = true;

  // Initialize columns titles with first empty
  listview.Columns.Add("");
  for ( int indexD2 = 0; indexD2 < matrix.GetLength(1); indexD2++ )
    listview.Columns.Add(strStudentNames[indexD2]);

  // Add rows with first column as title
  for ( int indexD1 = 0; indexD1 < matrix.GetLength(0); indexD1++ )
  {
    var item = new ListViewItem();
    item.Text = strAssignmentNames[indexD1];
    for ( int indexD2 = 0; indexD2 < matrix.GetLength(1); indexD2++ )
      item.SubItems.Add(matrix[indexD1, indexD2].ToString());
    listview.Items.Add(item);
  }

  // Add the list view to the form and show it
  form.Controls.Add(listview);
  form.ShowDialog();
}

您可以通过设计创建自定义表单,而不是创建动态表单,并在底部使用关闭按钮以拥有真正的消息框。您将添加一个以矩阵为参数的方法,并将代码放入此方法中:

public partial MyMessageBox : Form
{
  static public Run(decimal[,] matrix, string[] titleColumns, string[] titleRows)
  {
    if ( titleColumns.Length != matrix.GetLength(1) 
      || titleRows.Length != matrix.GetLength(0) )
      throw new ArgumentException("Bounds mismatch");
    var form = new MyMessageBox();
    form.ListView.Columns.Add("");
    for ( int indexD2 = 0; indexD2 < matrix.GetLength(1); indexD2++ )
      form.ListView.Columns.Add(titleColumns[indexD2]);
    for ( int indexD1 = 0; indexD1 < matrix.GetLength(0); indexD1++ )
    {
      var item = new ListViewItem();
      item.Text = titleRows[indexD1];
      for ( int indexD2 = 0; indexD2 < matrix.GetLength(1); indexD2++ )
        item.SubItems.Add(matrix[indexD1, indexD2].ToString());
      form.ListView.Items.Add(item);
    }
    form.ShowDialog();  
  }
}

所以你会这样使用它:

private void BtnTranspose_Click(object sender, EventArgs e)
{
  MyMessageBox.Run(TransposeMatrix(decGrades), strStudentNames, strAssignmentNames);
}  
于 2019-10-31T04:31:10.557 回答