【问题标题】:Formatting a 2D array in a Text Box在文本框中格式化二维数组
【发布时间】:2019-09-02 14:50:03
【问题描述】:

我正在尝试在文本框中显示类似的内容。

Name    Test    Basket  Destructive   Final Grade
--------------------------------------------------
Alex    0       0        0            0
Danny   0       0        0            0
Dave    0       0        0            0

这就是我得到的:

Name    Test    Basket  Destructive   Final Grade
--------------------------------------------------
Alex       0           0         0            0
Danny      0           0         0            0
Dave       0           0         0            0

比这更糟糕,因为我认为 0 的位置错误。

这个想法是让列在顶部,在它下面应该看起来像:

Name - Grade 1 - Grade 2 - Grade 3 - Final Grade

我做错了什么?

我也非常不擅长 for 循环,这就是为什么我认为 0 出现在错误位置的原因。

string[] Columns = { "Name","Test", "Basket","Destructive","Final Grade"};
string[] Names = { "Alex", "Danny", "Dave", "Goerge", "Hannan", "Ian", "Muna" };     

int[,] Grade = new int[7, 3];
int[] FinalGrade = new int[7];

private void uiShowMarksAZButton_Click(object sender, EventArgs e)
{
        //test
        Grade[0, 0] = 10;
        //test

        uiMarksDisplayTextBox.Text = string.Join("\t", Columns);
        uiMarksDisplayTextBox.Text += System.Environment.NewLine;

        for (int i = 0; i < Names.Length; i++ )
        {                
            uiMarksDisplayTextBox.Text += (Names[i]);
            for (int x = 0; x < 3; x++)
            {
                uiMarksDisplayTextBox.Text += ("\t" + Grade[x, x]);                  
            }
            uiMarksDisplayTextBox.Text += System.Environment.NewLine;
        }            
    }

编辑 1:添加一些说明,我的教授给了我表单的布局,我不允许更改它或文本框,这意味着我不能使用数据网格或列表视图。

当我输入 Alex 的成绩时,它看起来像这样:

Name    Test    Basket  Destructive   Final Grade
-------------------------------------------------
Alex    10      0       0
Danny   10      0       0
Dave    10      0       0
George  10      0       0
Hannan  10      0       0
Ian     10      0       0
Muna    10      0       0

为什么所有的 0 都在错误的位置?

【问题讨论】:

  • 只需使用列表视图/数据网格即可完成,但如果您不想这样做,则必须适当地填充项目
  • 您是否考虑过使用 DataGridView 或 ListView 来呈现该数据?
  • 如果没有“winforms”标签,这将与stackoverflow.com/questions/4579506/… 重复……但sting.Format 对于存在如此多丰富表格布局控件的WinForms 来说是非常奇怪的选择。
  • 尝试在TextBox 上设置Monospace 字体。这应该可以解决问题。
  • 不要添加所有这些空格。只是标签。在您的列连接上使用“\t”。破坏性的单词太长,会将下一列标题推到一个额外的选项卡上。是的,为此使用了错误的工具。

标签: c# winforms multidimensional-array


【解决方案1】:

首先,您可以使用制表符空格来对齐列中的所有内容。然后你需要调整索引,有一些错别字,最后的成绩也不见了。最长的文本字符串比典型的制表空间长,因此最好调整制表空间。这可以按照答案中的描述来完成

How to set the TAB width in a Windows Forms TextBox control?

进一步的代码包含了所有这些,它还需要上面答案中的SendMessage函数

using (Graphics graphics = uiMarksDisplayTextBox.CreateGraphics())
{
    int nMaxLength = (int)Columns.Concat(Names).Max(c => graphics.MeasureString(c + " ", uiMarksDisplayTextBox.Font).Width);
    SendMessage(uiMarksDisplayTextBox.Handle, EM_SETTABSTOPS, 1, new int[] { nMaxLength });
}

uiMarksDisplayTextBox.Text = string.Join("\t", Columns);
uiMarksDisplayTextBox.Text += System.Environment.NewLine;

for (int i = 0; i < Names.Length; i++)
{
    uiMarksDisplayTextBox.Text += Names[i];
    for (int x = 0; x < 3; x++)
    {
        uiMarksDisplayTextBox.Text += "\t" + Grade[i, x];
    }
    uiMarksDisplayTextBox.Text += "\t" + FinalGrade[i];
    uiMarksDisplayTextBox.Text += System.Environment.NewLine;
}

【讨论】:

    猜你喜欢
    • 2021-04-07
    • 1970-01-01
    • 2017-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    • 2023-03-11
    相关资源
    最近更新 更多