代码之家  ›  专栏  ›  技术社区  ›  Tony

下拉列表中的文本对齐方式

  •  0
  • Tony  · 技术社区  · 16 年前

    我有一个WinForms下拉列表。下拉列表显示格式为…

    <Description 30chars> Weight:<weight 6chars> Thickness:<thickness 6chars>
    

    我需要把绳子排成一列,这样重量总是从同一个点开始。所以,当有一个它们的列表时,所有的东西都排列得很好。

    我目前的解决方案是使用单空格字体并创建一个显示字符串,用空格填充每个部分,以使所有内容对齐。但是,字体看起来与应用程序的其他部分不同,并且测试版测试人员没有批准。有没有一种方法可以让文本在不使用单间距字体的情况下对齐?这样我就可以使用与应用程序其余部分相同的字体。

    谢谢你

    2 回复  |  直到 16 年前
        1
  •  1
  •   dvallejo    16 年前

    查看组合框的drawitem事件。在那里你可以做任何形式的格式化。确保将DrawMode设置为OwnerDrawXXXX。

     private void comboBox1_DrawItem(object sender, DrawItemEventArgs e)
            {
                ComboBox cb = (ComboBox)sender;
                int index = e.Index;
                Graphics g = e.Graphics;
    
                DataItem item = (DataItem)cb.Items[index];
    
                g.DrawString(item.Name, new Font("Arial", 8), new SolidBrush(Color.Blue), 0, e.Bounds.Y);
                g.DrawString(item.Age.ToString(), new Font("Arial", 8), new SolidBrush(Color.Blue), 100, e.Bounds.Y);
            }
    
            public class DataItem
            {
                public string Name;
                public int Age;
    
                public override string ToString()
                {
                    return string.Format("{0} {1}", Name, Age);
                }
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                comboBox1.Items.Add(new DataItem { Name = "Apple", Age = 10 });
                comboBox1.Items.Add(new DataItem { Name = "Berry", Age = 20 });
                comboBox1.Items.Add(new DataItem { Name = "Cherry", Age = 30 });
            }
    
        2
  •  1
  •   Hans Passant    16 年前

    这看起来是一个很有问题的问题,我假设你是在谈论ComboBox。是的,您可以对它的DrawMode属性做些什么。当您将其设置为OwnerDrawFixed时,您可以实现一个DrawItem事件处理程序,并按照您想要的方式绘制下拉项。在这个事件的msdn库主题中有一个很好的例子。

    您需要做额外的工作,以便在组合框的文本框部分正确显示它。不应该是个问题,你不需要列。也许您可以用一个独特的字符分隔项目,您也可以在drawitem事件中使用它来查找列文本。