简体   繁体   English

C#列表框,ownerdrawfixed,获取选定的项目

[英]c# listbox, ownerdrawfixed, get selected item

my program runs a search in files and when the string is found it, it filters them in between another string and then shows them in the listbox with corresponding colors(red for bad line's determined by the second filter) and green for the good one's, the listbox shows location\\file, and on a different line the line itself. 我的程序在文件中进行搜索,当找到该字符串时,它会在另一个字符串之间进行过滤,然后在列表框中显示相应的颜色(红色表示由第二个过滤器确定的坏行),绿色表示相应的颜色,列表框显示location \\ file,并在另一行显示行本身。

now i want to open the file by dubbelclicking on the location\\filebut my code does not work in ownerdrawfixed (wich i need/want for the colors) i tried 现在我想通过dubbelclicking location \\ file来打开文件,但是我的代码在ownerdrawfixed中无效(我需要/想要颜色)我尝试过

string filename = listBox1.GetItemText(listBox1.selectedItem);
if (file.exists(filename))//to check if i click on a filename or on a line
  {
  try
    {
      System.diagnostics.process.start("scite.exe",filename); //open file with scite
    }
   catch
   {
     system.Diagnostics.Process.start(filename);//open file with windows default
   }

I learned that the string "filename" now contains "Datscan.Form1+MyListboxItem" 我了解到字符串“文件名”现在包含“ Datscan.Form1 + MyListboxItem”

Found alot of answers on how to do it with drawmode set to normal but i need it in ownerdrawfixed. 找到了很多关于如何将drawmode设置为normal的答案,但是我需要ownerdrawfixed中使用它。

Here's a minimal example I just put together that, hopefully, will help you narrow down your issues. 这是我整理的一个最小示例,希望可以帮助您缩小问题范围。 It does not EXEcute the selection, rather it displays the selection in a label beside the ListBox. 它不执行选择,而是在列表框旁边的标签中显示选择。 But that's just to show you that the proper value gets pulled out. 但这只是向您显示适当的值被提取出来。 Then it's only trivial to route the value to something that would EXEcute it, rather than display it. 然后,将值路由到将执行该值而不是显示该值的琐事是微不足道的。

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


namespace ListBox_15948283
{
    public partial class Form1 : Form
    {
        private int ItemMargin = 5;
        private int labelCount = 0;

        public Form1()
        {
            InitializeComponent();
            ListBox lb = new ListBox();//initialize a new ListBox
            lb.DrawMode = DrawMode.OwnerDrawFixed;//lets meet YOUR requirement of OwnerDrawFixed
            lb.Location = new Point(25, 25);//position the ListBox
            lb.DrawItem += Lb_DrawItem;//give it a Draw event handler
            lb.MeasureItem += Lb_MeasureItem;//give it a MeasureItem event handler
            lb.Name = "lstbx_Yep";//give the listbox a name so we can call it later
            lb.Items.Add("Option 1");//add an option
            lb.Items.Add("Option 2");//add an option
            lb.Items.Add("Option 3");//add an option
            lb.Items.Add("Option 4");//add an option
            lb.MouseDoubleClick += Lb_MouseDoubleClick;//add a doubleClick event handler on the ListBox
            this.Controls.Add(lb);//add the listbox to the form
        }

        private void Lb_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            ListBox lb = ((ListBox)this.Controls.Find("lstbx_Yep", false)[0]);//get the listbox
            Label lbl = new Label();//make a label to display the result
            lbl.Location = new Point(150, (labelCount * 25) + 50);//position the label
            lbl.Text = lb.SelectedItem.ToString();//get the selected item
            this.Controls.Add(lbl);//add the label to the form
            labelCount++;

        }

        /*
         * Code below taken from
         * http://csharphelper.com/blog/2014/11/make-an-owner-drawn-listbox-in-c/
         */
        private void Lb_MeasureItem(object sender, MeasureItemEventArgs e)
        {
            // Get the ListBox and the item.
            ListBox lst = sender as ListBox;
            string txt = (string)lst.Items[e.Index];

            // Measure the string.
            SizeF txt_size = e.Graphics.MeasureString(txt, this.Font);

            // Set the required size.
            e.ItemHeight = (int)txt_size.Height + 2 * ItemMargin;
            e.ItemWidth = (int)txt_size.Width;
        }

        private void Lb_DrawItem(object sender, DrawItemEventArgs e)
        {
            // Get the ListBox and the item.
            ListBox lst = sender as ListBox;
            string txt = (string)lst.Items[e.Index];

            // Draw the background.
            e.DrawBackground();

            // See if the item is selected.
            if ((e.State & DrawItemState.Selected) ==
                DrawItemState.Selected)
            {
                // Selected. Draw with the system highlight color.
                e.Graphics.DrawString(txt, this.Font,
                    SystemBrushes.HighlightText, e.Bounds.Left,
                        e.Bounds.Top + ItemMargin);
            }
            else
            {
                // Not selected. Draw with ListBox's foreground color.
                using (SolidBrush br = new SolidBrush(e.ForeColor))
                {
                    e.Graphics.DrawString(txt, this.Font, br,
                        e.Bounds.Left, e.Bounds.Top + ItemMargin);
                }
            }

            // Draw the focus rectangle if appropriate.
            e.DrawFocusRectangle();
        }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM