2012-05-31 84 views
0

我用一個TextBox接受一個單詞並搜索一堆句子來查看它們是否包含該單詞,然後我必須出現這些句子並突出顯示該單詞。我的計劃是製作一個ListBox並在其中添加句子。我的問題是如何突出這個詞(通過改變我想的顏色),以便可以區分它。如何更改列表框中的單詞的顏色

有沒有更好的方法? 我選擇了ListBox,所以我可以選擇我正在尋找的句子。

編輯

根據@Thorsten迪特馬方向上創建所有者繪製的列表框。

public partial class Form1 : Form 
    { 
     private List<string> _items; 

     public Form1() 
     { 
      InitializeComponent(); 
      _items = new List<string>(); 
      _items.Add("One"); 
      _items.Add("Two"); 
      _items.Add("Three"); 
      listBox1.DataSource = _items; 
     } 

     private void listBox1_DrawItem(object sender, DrawItemEventArgs e) 
     { 
      e.DrawBackground(); 
      e.DrawFocusRectangle(); 
      e.Graphics.DrawString(_items[e.Index], 
       new Font(FontFamily.GenericSansSerif, 
        8, FontStyle.Bold), 
        new SolidBrush(Color.Red), e.Bounds); 
     } 
    } 

我如何分割句子以便只繪製一個單詞?

EDIT2

的方式我終於做到了就是讓兩個單獨的部件,以compine我的選擇。 一個是用彩色的所有句子和選項ListBox選擇一個 這些和其他一個RichBox設有獨立的彩色的話,因爲是很難 以實現與ListBox(對我來說是最少)。

我完成這個的方式是使用布爾數組指出每個句子應該爲哪個詞應該着色 。

for (int i = 0; i < words.Length; i++) 
{ 
    if (segments[i]) //<-boolean array 
    { 
    rich.SelectionColor = Color.Red; 
    rich.AppendText(words[i] + " "); 
    rich.SelectionColor = Color.Black; 
    } 
    else 
    { 
    rich.AppendText(words[i] + " "); 
    } 
} 
+0

我們在說winforms?只是確保。 –

+0

@Baboon一個'窗口系統窗體' –

+0

你可能想看看[這個](http://stackoverflow.com/questions/91747/background-color-of-a-listbox-item-winforms)。 –

回答

0

一個簡單的TextBox可以設置它的Foreground屬性,但它適用於TextBox中的整個文本。

如果你想具體的話是「突出」,您可能需要拆分句子的幾個文本框(髒),或使用的RichTextBox

+0

他不想突出顯示文本框中的單詞,但正如他所說,在列表框中。 –

+0

是的你是對的,但如果有一個更好的方法或替代我想知道它。 –

+0

@ThorstenDittmar他可以自定義ListBoxItem以使用RichTextBox。 –

1

有一個在Windows窗體做的沒有標準的方式。您必須手動呈現列表項目(創建所有者繪製列表框)。在WPF中這將是一件容易的事。

編輯
繪製只是以不同字體的字符串的一部分是不容易的事。我想嘗試的是以下內容:

介紹令牌,告訴你「大膽開始」和「大膽結束」 - 有點像HTML。讓我們把它們和HTML中一樣。所以你的字符串可能看起來像這樣:

Hello, I am <b>bold</b> text<b>!</b> 

現在我將我的字符串標記爲非粗體文本和粗體文本。在當前位置

  1. 拉繩在當前格式由寬x
  2. 增大位置X:我會得到以下幾個部分:

    Hello, I am 
    bold 
    text 
    ! 
    

    現在我會使用以下算法得出每個部分在步驟繪製的字符串的1

  3. 格式化根據即將到來的字符串改變
  4. 轉到1

在第2步中將調用Graphics.MeasureString方法來獲取字符串的寬度。

這樣做了4兩件以上的會導致:

您好,我是
您好,我是大膽
您好,我是大膽文本
您好,我是大膽文字

+0

如果我創建一個所有者繪製的ListBox,我可以突出顯示ListItem的單個單詞而不是整個東西? –

+0

好吧,就像你自己繪製文字和背景一樣,你可以想出一個解決方案,讓一個單詞變粗體或改變背景。但即使在自己繪製單個列表項目時,也沒有內建解決方案。 –

+0

這是一個好主意,我應該嘗試。 –

0

Giannosfor,作爲對您的評論的迴應,您必須使用事件處理函數的參數e來選擇您想要高亮度的項目(link here)。

看看Shadow Wizard的反應,特別是使用e.Index。

Graphics g = e.Graphics; 
... 
g.FillRectangle(new SolidBrush(color), e.Bounds); 

變量g表示當前項目的圖形部分e。方法FillRectangle允許您更改項目背景的顏色。

編輯1:

我試圖做的,你在下面的評論說,但似乎沒有辦法才用hightlight列表框的字符串的一部分。對我來說,似乎唯一能夠支持的控件是RichTextBox。解決方案可能是以RichTextBoxes列表的形式實現您自己的用戶控件。

+0

我的問題正是如何定義當前項目'e'的特定圖形部分(我的意思是代碼)以改變背景?如果我目前的項目是「The Dog」,我想突出它喜歡這個「The Dog」,而不是整個句子。如果你能幫助我,我會感激。 –

+0

我編輯了我的答案,讓你知道如何做到這一點。 –