2012-07-24 4 views
1

Visual C# .NET에서 도구를 만들고 있습니다. 도구의 알고리즘은 괄호 앞뒤의 모든 공백을 검사하고 발견 된 오류에 대한 오류 메시지를 작성하는 것입니다. 예 : 입력이 (텍스트) 괄호 앞뒤의 공백이 감지되어 오류가 발생합니다.
오류가 발견되면 코드는 listview1.items()에 오류를 추가합니다. 여기에 내 코드입니다에 대한 C# .Net : 내 목록보기 항목을 클릭 할 수있게 만드는 방법

내 질문에 훨씬 명확하게하려면 :

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()); 
      } 
     } 

내가 무엇을 찾고 클릭은 사용자에 의해 만들어진 후 내 listview1의 모든 항목을 클릭 할 수 및 것입니다 도구는 richtextbox1에있는 오류를 강조 표시합니다.

모든 도움 주셔서 감사합니다.

+0

당신이 이것을 달성하기 위해 jQuery로 클라이언트 측 스크립트를 조사 할 수 있습니다. – ianaldo21

+0

C#에서만 그런 종류의 것을 만들 수 없다는 뜻입니까? – neo

+0

질문이 아니라면 정적 메서드 인 Regex.Matches를 사용해야합니다 (인스턴스 메서드와의 차이점을 알고 최적화를 수행하는 경우는 예외). –

답변

0

누군가 이미 이야기했듯이 일치 항목의 색인 및 길이 속성을 사용하십시오. 이상한 텍스트 상자 선택 전략을 구현하는 간단한 예가 있습니다. 그러나 효과적으로 개념을 보여주는 작품 :

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; 
    } 
} 
+0

이것은 아마도 내가 찾는 대답입니다. 나는 이것을 시도 할 것이고 당신에게 맞는 답을 찾은 사람들을 업데이트 할 것입니다! – neo

+0

이미 프로젝트에서이 문제를 해결했습니다! 슈퍼 감사합니다. 정말 큰 도움! Diego 다시 한 번 감사드립니다! – neo

+0

여기서 유일한 문제는 richTextbox1에 입력 된 문자열이 여러 줄인 경우 입력이 너무 많으면 목록보기에서 오류를 클릭 할 때 너무 많은 문자를 검색하기 때문에 속도가 느려진다는 것입니다. 어떻게 그런 종류의 것을 최소화 할 수 있습니까? 이 경우 덕분에 – neo

0

Match 객체 (예 : firstMatch)에는 Index and Length이라는 두 가지 유용한 속성이 있습니다.

그들은 원본 텍스트에서 문제의 경기의 위치와 길이를 제공합니다. 당신의 지식에 따르면, 당신은 단지 richTextBox에 하이라이트를 구현해야합니다!

+0

그리고 목록보기 항목을 클릭 할 수있게 만들고 항목을 클릭했는지 확인하는 데 문제가 있으면 먼저 사용중인 기술을 지정하십시오. WinForms? WPF? –

+0

WinForms를 사용하고 있습니다. 답변 해주셔서 감사합니다! – neo

관련 문제