0

我正在创建一个用户控件,它创建一个双数组表。我能够绘制它们,但我不知道如何对齐这些值。

示例:我的数据看起来像

 double[] data = new double[]
            {
                -13.5,
                -8.5,
                -3.5,
                0,
                3.5,
                8.5,
                13.5
            };

所以我希望当我绘制这些值时,它们应该对齐(右对齐),以便所有值的点都出现在同一个位置。

这是我正在使用的代码:

private void DrawTable()
        {
            _format.Alignment = StringAlignment.Far;
            _format.LineAlignment = StringAlignment.Far;
            int yPos = 2;
            RectangleF rect = RectangleF.Empty;
            foreach (var item in Data)
            {
                string str = item.ToString("F3");
                str = string.Format("{0}dB", str);
                str = string.Format("{0,10}",str);
                SizeF size = _gBmp.MeasureString(str, Font);
                rect.X = 5;
                rect.Y = yPos;
                rect.Width = size.Width;
                rect.Height = size.Height;
                _gBmp.DrawString(str, Font, _textBrush, rect, _format);
                yPos += 20;
            }
        }
4

3 回答 3

0

问题是您正在通过测量字符串的大小创建的矩形中绘制每个项目。

相反,您需要为绘制的每个字符串使用相同宽度的矩形。然后,如果您右对齐字符串,它们将对齐(前提是您使用相同的字体)。

不要使用String.Format填充为您填充字符串。这不是使用 GDI+ 的正确方法,它主要用于固定宽度字体,如控制台显示。您要使用字符串格式的唯一方法是指定固定的小数位数。

如果我希望列的宽度通常动态调整大小,我所做的是测量列表中的每个元素,然后选择所有测量宽度的最大宽度。不过,通常你想把它夹到最大宽度,以防你有一根很长的绳子。

于 2013-11-05T16:47:16.130 回答
0

字符串对象的使用PadLeft()方法。您现在需要的只是将数字格式化为等于小数,以便找到小数点后的最大字符,然后找到最大的整数,并将小数点的字符加起来,然后PadLeft()将空格与您刚刚计算的最大字符相加

于 2013-11-05T18:23:00.603 回答
-1

一个GridView就够了..?? 整数部分右对齐列,小数部分左对齐列。隐藏单元格边框,只读/禁用整个网格...

于 2013-11-05T16:50:05.630 回答