在 ComboBox 中显示 ChartType 列表 - Chart

Show list of ChartType in ComboBox - Chart

我想在 visual studio 2019 年创建一个组合框,如图所示,

如何从 ChartType ComboBox 中提取图像并在我的 ComboBox 中显示带有图像的 ChartType 列表?

要获取图像,您需要从已编译的 .Net 程序集中的嵌入式资源中提取它们。您需要将 using System.Resources; 添加到您的 using 语句中。

从包含图表 System.Windows.Forms.DataVisualization.Charting.Chart

的程序集中获取清单流 System.Windows.Forms.DataVisualization.Charting.Design.resources
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button2_Click(object sender, EventArgs e)
    {
        var resourceStream = typeof(System.Windows.Forms.DataVisualization.Charting.Chart)
            .Assembly.GetManifestResourceStream("System.Windows.Forms.DataVisualization.Charting.Design.resources");
        using (System.Resources.ResourceReader resReader = new ResourceReader(resourceStream))
        {
            var dictEnumerator = resReader.GetEnumerator();
            while (dictEnumerator.MoveNext())
            {
                var ent = dictEnumerator.Entry;                   
                imageList1.Images.Add($"{ent.Key}", ent.Value as Bitmap);
                listView1.Items.Add(new ListViewItem($"{ent.Key}", $"{ent.Key}"));
            }
        }
    }
}

为简单起见,我只是将它添加到链接到 ListViewImageList

listView1.View = View.LargeIcon;
listView1.LargeImageList = imageList1;
listView1.SmallImageList = imageList1

这是结果。


使用 drop-down

创建组合框

对于我查看的组合 this questions

代码: 在 while 块中

   ...
   ...
    while (dictEnumerator.MoveNext())
    {
       var ent = dictEnumerator.Entry;
       chartSelector1.Items.Add(new ChartDropDownItem($"{ent.Key}",ent.Value as Bitmap));
    }
   ...
   ...

和额外的 类:(这将在构建项目后在您的工具箱中创建一个 ChartSelector 控件)

public class ChartDropDownItem
{
    public string Value { get; set; }

    public Image Image { get; set; }

    public ChartDropDownItem(string val, Bitmap img)
    {
        Value = val;
        Image = img;
    }
}

public class ChartSelector : ComboBox
{
    public ChartSelector()
    {
        DrawMode = DrawMode.OwnerDrawFixed;
        DropDownStyle = ComboBoxStyle.DropDownList;
    }

    protected override void OnDrawItem(DrawItemEventArgs e)
    {
        e.DrawBackground();
        e.DrawFocusRectangle();

        if (e.Index >= 0 && e.Index < Items.Count)
        {
            ChartDropDownItem item = (ChartDropDownItem)Items[e.Index];

            e.Graphics.DrawImage(item.Image, e.Bounds.Left, e.Bounds.Top);
            e.Graphics.DrawString(item.Value, e.Font, new SolidBrush(e.ForeColor), e.Bounds.Left + item.Image.Width, e.Bounds.Top + 2);
        }

        base.OnDrawItem(e);
    }
}

看起来像这样:

以下是我的代码,没有使用额外的类。这是在 CobyC Answer 的帮助下完成的。

private List<string> dataSourceNames = new List<string>();
private List<Bitmap> dataSourceImage = new List<Bitmap>();

private void loadCombobox1()
{
    // Get ChartTypes and Images 
    var resourceStream = typeof(Chart).Assembly
            .GetManifestResourceStream("System.Windows.Forms.DataVisualization.Charting.Design.resources");

    using (System.Resources.ResourceReader resReader = new ResourceReader(resourceStream))
    {
        var dictEnumerator = resReader.GetEnumerator();

        while (dictEnumerator.MoveNext())
        {
            var ent = dictEnumerator.Entry;
            dataSourceNames.Add(ent.Key.ToString());
            dataSourceImage.Add(ent.Value as Bitmap);
         }
     }

     //Load ChartType Into combobox
     comboBox1.DataSource = dataSourceNames;
     comboBox1.MaxDropDownItems = 10;
     comboBox1.IntegralHeight = false;
     comboBox1.DrawMode = DrawMode.OwnerDrawFixed;
     comboBox1.DropDownStyle = ComboBoxStyle.DropDownList;
     comboBox1.DrawItem += comboBox1_DrawItem;
 }

private void comboBox1_DrawItem(object sender, DrawItemEventArgs e)
{
    e.DrawBackground();
    if (e.Index >= 0)
    {
        // Get text string
        var txt = comboBox1.GetItemText(comboBox1.Items[e.Index]);
        
        // Specify points for drawing
        var r1 = new Rectangle(e.Bounds.Left + 1, e.Bounds.Top + 1,
                2 * (e.Bounds.Height - 2), e.Bounds.Height - 2);

        var r2 = Rectangle.FromLTRB(r1.Right + 2, e.Bounds.Top,
                e.Bounds.Right, e.Bounds.Bottom);

        //Draw Image from list
        e.Graphics.DrawImage(dataSourceImage[e.Index], r1);
        e.Graphics.DrawRectangle(Pens.Black, r1);
        TextRenderer.DrawText(e.Graphics, txt, comboBox1.Font, r2,
                comboBox1.ForeColor, TextFormatFlags.Left | TextFormatFlags.VerticalCenter);
    }
}