简体   繁体   中英

C#.Net : How to make my listview items clickable

I am creating a tool in Visual C#.Net. The algorithm of the tool is to check for all space/s before/after a parenthesis and create an error message for the found errors. For example: input is ( Text ) Error will be raise because space before and after the parenthesis is detected.
If errors are found the code will add the errors in listview1.items().

To make my question much clearer for you here's my code:

private void button1_Click(object sender, EventArgs e)
        {
            int error_counter = 0;
            listView1.Items.Clear();

            //requirement 8c
            //check for a space in open and close parenthesis
            Regex test = new Regex(@"\(\s.+\s\)|\[\s.+\s\]|\{\s.+\s\}", RegexOptions.IgnoreCase);
            MatchCollection matchlist = test.Matches(richTextbox1.Text);
            if (matchlist.Count > 0)
            {
                for (int i = 0; i < matchlist.Count; i++)
                {
                    Match firstMatch = matchlist[i];
                    string firstMatch_string = firstMatch.ToString();
                    string[] errors = new string[matchlist.Count];
                    errors[i] = "Ommit Space between a bracket";
                    listView1.Items.Add(errors[i]);
                    error_counter++;
                }
            }
        }

        private void listView1_ItemActivate(object sender, EventArgs e)
        {
            if (listView1.SelectedItems.Count > 0)
            {
                ListViewItem item = listView1.SelectedItems[0];
                MessageBox.Show(item.ToString());
            }
        }

What I looking for is that all of the items of my listview1 will be clickable, and after a click was made by the user the tool will highlight the error found in the richtextbox1.

Thanks for all your help guys!

The Match object (like firstMatch) has two usefull properties here : Index and Length .

They give you the position and the length of the match in question in the original text. With that in your knowledge, you just have to implement the highlight in the richTextBox !

As someone already told you, use the Index and Length properties of the Match class. Here's a short example implementing a weird textbox selection strategy. But it works effectively demonstrating the concept:

public partial class Form1 : Form
{
    List<Error> errors = new List<Error>();

    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        errors = new List<Error>();
        listView1.Items.Clear();                                    
        foreach(Match m in Regex.Matches(richTextBox1.Text, @"(\(\s+|\s+\)|\[\s+|\s+\]|\{\s+|\s+\})", RegexOptions.IgnoreCase))
        {                           
            //you may decide to differentiate the msg according to the specific problem
            Error error = new Error(m, "Ommit Space between a bracket");
            this.errors.Add(error);
            listView1.Items.Add(error.msg);                
        }            
    }

    private void listView1_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (listView1.SelectedIndices.Count > 0)
        {
            Error error = errors[listView1.SelectedIndices[0]];
            Select(richTextBox1, error);
        }
    }

    private static void Select(RichTextBox rtb, Error e) {
        string o = rtb.Text;
        rtb.Clear();
        for (int i = 0; i < o.Length; i++)
        {
            if (i >= e.index && i <= e.index + e.length)
            {
                rtb.SelectionColor = Color.White;
                rtb.SelectionBackColor = Color.Red;
            }
            else
            {
                rtb.SelectionColor = Color.Black;
                rtb.SelectionBackColor = Color.White;
            }
            rtb.AppendText(o[i].ToString());
        }
    }              
}

public class Error
{

    public int index;
    public int length;
    public string value;
    public string msg;

    public Error(Match m, string msg)
    {
        this.index = m.Index;
        this.length = m.Length;
        this.value = m.Value;
        this.msg = msg;
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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