【问题标题】:c# how to correctly align number in DataGridc#如何正确对齐DataGrid中的数字
【发布时间】:2017-07-16 09:26:08
【问题描述】:

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

欧元金额在dataTable中显示如下:

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

现在我知道了一种处理这个问题的迂回方法(因为:dataTable-object 本身应该如何知道如何与我的意愿保持一致?)

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

【问题讨论】:

    标签: c# datatable datagrid alignment


    【解决方案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

    【讨论】:

    • 这是一个解决方案,虽然我的做法很像我,但我认为你的输出更安全。
    • 我用可用的信息回答了这个问题。
    【解决方案2】:

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

    下面是一个示例应用程序,其 DataGrid 包含 2 列,其中一列的值右对齐。这里的基本线是

    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

    【讨论】:

    • 我非常感谢您非常详细的回答,尽管如所述方法所述,对齐仅向右移动。我想要调整对齐以输入内容的总比例。我无法将其显示为评论,但我想要的输出在我的问题中。
    • 但是你确实让我想到了一个想法来做一个特定的 IF 语句来检查一个字符是否包含'x' - 字符数量,如果它比以前的少,它的单元格-content 应该向右对齐。
    【解决方案3】:

    我假设它是 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;
            }
        }
    

    【讨论】:

    • 抱歉,我的问题似乎有待解释,它是一个 Windows 窗体应用程序。这是一个非常详细的解释,但它是普遍有用的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-18
    • 2019-10-08
    • 1970-01-01
    • 2011-10-09
    • 2018-06-30
    • 2015-02-13
    • 2016-08-07
    相关资源
    最近更新 更多