c#如何在DataGrid中正确对齐数字

时间:2017-02-25 14:38:04

标签: c# datatable datagrid alignment

我有一个工作的Windows窗体应用程序,它在事务数据中加载并对其进行分类,添加在该特定类别上花费的欧元金额。

欧元数量显示在dataTable中,如下所示:

cells

但在表示数字时我想要正确对齐。所以这就是我的意思:

enter image description here

现在我知道处理这个问题的一种狡猾的方法(因为:dataTable-object本身应该如何知道如何符合我的意愿?)

possible solution

但我想知道这种情况是否有更好的方法。

3 个答案:

答案 0 :(得分:1)

您可以使用padLeft

string euroPart = transactionParts[4].trim('"');
string euroPartFixed;
if(europart.length == 6){
    europartFixed = euroPart.PadLeft(7, ' ')
} else if(europart.length == 5){
   europartFixed = euroPart.PadLeft(6, ' ')
} else if(europart.length == 4){
   europartFixed = euroPart.PadLeft(5, ' ')
}

请注意padleft(X, ' ') x必须是您要填充的字符串的大小

工作示例:http://ideone.com/TJlCbE

答案 1 :(得分:1)

我假设它是Windows窗体应用程序。

下面是一个示例应用,其中包含一个包含2列的DataGrid,其中一列的值右对齐。这里必不可少的是

Alignment = HorizontalAlignment.Right

应用程序(复制/粘贴并运行它以查看结果):

using System.Data;
using System.Drawing;
using System.Windows.Forms;

public class Form1 : System.Windows.Forms.Form
{
    public static void Main()
    {
        Application.Run(new Form1());
    }

    public Form1()
    {
        var myDataGrid = new DataGrid();
        ClientSize = new System.Drawing.Size(450, 330);
        myDataGrid.Location = new Point(24, 50);
        myDataGrid.Size = new Size(300, 200);

        Controls.Add(myDataGrid);

        myDataGrid.SetDataBinding(MakeDataSet(), "MyTable");

        var tableStyle = new DataGridTableStyle { MappingName = "MyTable" };
        var nameColumnStyle = new DataGridTextBoxColumn { MappingName = "Name" };
        var sumColumnStyle = new DataGridTextBoxColumn
        {
            MappingName = "Sum",
            Width = 170,
            Alignment = HorizontalAlignment.Right
        };
        tableStyle.GridColumnStyles.Add(nameColumnStyle);
        tableStyle.GridColumnStyles.Add(sumColumnStyle);
        myDataGrid.TableStyles.Add(tableStyle);
    }

    private DataSet MakeDataSet()
    {
        var dataSet = new DataSet("myDataSet");
        var table = new DataTable("MyTable");
        var nameCol = new DataColumn("Name");
        var sumCol = new DataColumn("Sum", typeof(float));
        table.Columns.Add(nameCol);
        table.Columns.Add(sumCol);

        dataSet.Tables.Add(table);

        var row1 = table.NewRow();
        row1["Name"] = "Bank";
        row1["Sum"] = 1.25;
        table.Rows.Add(row1);

        var row2 = table.NewRow();
        row2["Name"] = "Hosting";
        row2["Sum"] = 12.5;
        table.Rows.Add(row2);

        return dataSet;
    }
}

<强>更新

以下是您需要的自定义对齐示例,它是一个控制台应用,但相同的代码可以在Windows窗体应用中使用:

    class Program
    {
        static void Main(string[] args)
        {
            var numbers = new[] { 1, 100.12, 50.218, 0.5 };
            int length = 10;
            var separator = CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator;

            foreach (var n in numbers.Select(i => i.ToString()))
            {
                var offset = n.Contains(separator) ? n.Length - n.IndexOf(separator) : 0;
                string format = string.Format("{{0, {0}}}", length + offset);
                Console.WriteLine(string.Format(format, n));
            }
        }
    }

根据您的需要调整变量length

答案 2 :(得分:1)

我认为它是ASP.NET中的Web应用程序

如果您想正确对齐您的数字,请使用此

<asp:BoundColumn DataField="Value" HeaderText="Value" ItemStyle-HorizontalAlign="Right" DataFormatString="{0:#,##0.00}" ItemStyle-Width="100px"></asp:BoundColumn>

如果您希望数字尽可能接近左边距,则使用此

<asp:BoundColumn DataField="ValueString" HeaderText="ValueString" ItemStyle-Width="300px"></asp:BoundColumn>

要使其正常工作,您必须在数据源中添加一个额外的列,其中包含值的字符串表示形式,您将在数字前插入各种空格字符。

以下是如何操作数据的示例

    private void BindData()
    {
        List<Data> data = new List<Data>();
        decimal maxValue = 435;

        data.Add(new Data("Familie", 435m));
        data.Add(new Data("Bank", 1.25m));
        data.Add(new Data("Hosting", 12.1m));

        for (int i = 0; i < data.Count; i++)
        {
            Data item = data[i];
            item.ValueString = buildSpaces(100 - (int)((item.Value / maxValue) * 100)) + item.Value.ToString();
        }
        dg.DataSource = data;
        dg.DataBind();
    }

    private string buildSpaces(int number)
    {
        System.Text.StringBuilder sb = new System.Text.StringBuilder();
        for (int i = 0; i < number; i++)
            sb.Append("&nbsp;");
        return sb.ToString();
    }

您的数据类将是这样的

     public class Data
    {
        public string Name { get; set; }
        public decimal Value { get; set; }
        public string ValueString { get; set; }

        public Data()
        {

        }
        public Data(string name, decimal value)
        {
            Name = name;
            Value = value;
        }
    }