2010-02-18 6 views
5

मैं ListView में खोज परिणामों का एक सेट प्रदर्शित कर रहा हूं। पहले कॉलम में खोज शब्द होता है, और दूसरा मैच की संख्या दिखाता है।क्या मैं लिस्ट व्यू के विस्तार मोड में लिंक प्रदर्शित कर सकता हूं?

हजारों पंक्तियां हैं, इसलिए ListView आभासी मोड में है।

मैं इसे बदलना चाहता हूं ताकि दूसरा कॉलम मैचों को हाइपरलिंक्स के रूप में दिखाता है, उसी तरह LinkLabel लिंक दिखाता है; जब उपयोगकर्ता लिंक पर क्लिक करता है, तो मैं एक ऐसा ईवेंट प्राप्त करना चाहता हूं जो मुझे हमारे आवेदन में कहीं और मैच खोलने दे।

क्या यह संभव है, और यदि हां, तो कैसे?

संपादित करें: मुझे नहीं लगता कि मैं पर्याप्त रूप से स्पष्ट किया गया है - मैं एक एकल स्तंभ में कई हाइपरलिंक चाहते हैं, बस के रूप में यह एक एकल LinkLabel में कई हाइपरलिंक होना संभव नहीं है।

उत्तर

0

आप HotTracking को सत्य में सेट कर सकते हैं ताकि जब उपयोगकर्ता आइटम पर माउस को घुमाएगा तो यह लिंक के रूप में दिखाई देगा।

+0

क्या यह सिर्फ प्रत्येक पंक्ति के लिए नहीं करता है? मैं इसे उप-वर्ग में अलग-अलग पाठ श्रेणियों के लिए करना चाहता हूं। – Simon

6

आप इसे आसानी से नकली बना सकते हैं। सुनिश्चित करें कि आपके द्वारा जोड़े गए सूची दृश्य आइटम में UseItemStyleForSubItems = झूठी है ताकि आप उप-आइटम के ForeColor को नीले रंग में सेट कर सकें। MouseMove ईवेंट को कार्यान्वित करें ताकि आप "लिंक" को रेखांकित कर सकें और कर्सर को बदल सकें।

ListViewItem.ListViewSubItem mSelected; 

private void listView1_MouseMove(object sender, MouseEventArgs e) { 
    var info = listView1.HitTest(e.Location); 
    if (info.SubItem == mSelected) return; 
    if (mSelected != null) mSelected.Font = listView1.Font; 
    mSelected = null; 
    listView1.Cursor = Cursors.Default; 
    if (info.SubItem != null && info.Item.SubItems[1] == info.SubItem) { 
    info.SubItem.Font = new Font(info.SubItem.Font, FontStyle.Underline); 
    listView1.Cursor = Cursors.Hand; 
    mSelected = info.SubItem; 
    } 
} 

ध्यान दें कि यह टुकड़ा जांच करता है कि 2 कॉलम hovered है, के रूप में की जरूरत tweak: उदाहरण के लिए।

1

अन्य उत्तर यहां बहुत अच्छे हैं, लेकिन यदि आप एक साथ कुछ कोड हैक करना नहीं चाहते हैं, तो DataGridView नियंत्रण देखें जो LinkLabel समकक्ष कॉलम के लिए समर्थन करता है।

इस नियंत्रण का उपयोग करके, आपको ListView में विवरण दृश्य की सभी कार्यक्षमता मिलती है, लेकिन प्रति पंक्ति अधिक अनुकूलन के साथ।

+0

DataGridViewLinkCell केवल एक लिंक दिखाता है - यह आपको लिंकलेबल की तरह कई लिंक नहीं करने देगा। – Simon

1

आप ListView को विरासत में प्राप्त कर सकते हैं OnDrawSubItem विधि को ओवरराइड कर सकते हैं। - एक मानक ListView चारों ओर एक खुला स्रोत आवरण

public class MyListView : ListView 
{ 
    private Brush m_brush; 
    private Pen m_pen; 

    public MyListView() 
    { 
     this.OwnerDraw = true; 

     m_brush = new SolidBrush(Color.Blue); 
     m_pen = new Pen(m_brush) 
    } 

    protected override void OnDrawColumnHeader(DrawListViewColumnHeaderEventArgs e) 
    { 
     e.DrawDefault = true; 
    } 

    protected override void OnDrawSubItem(DrawListViewSubItemEventArgs e) 
    { 
     if (e.ColumnIndex != 1) { 
      e.DrawDefault = true; 
      return; 
     } 

     // Draw the item's background. 
     e.DrawBackground(); 

     var textSize = e.Graphics.MeasureString(e.SubItem.Text, e.SubItem.Font); 
     var textY = e.Bounds.Y + ((e.Bounds.Height - textSize.Height)/2); 
     int textX = e.SubItem.Bounds.Location.X; 
     var lineY = textY + textSize.Height; 

     // Do the drawing of the underlined text. 
     e.Graphics.DrawString(e.SubItem.Text, e.SubItem.Font, m_brush, textX, textY); 
     e.Graphics.DrawLine(m_pen, textX, lineY, textX + textSize.Width, lineY); 
    } 
} 
3

उपयोग ObjectListView:
यहाँ आप कैसे कर सकता है की एक बहुत ही सरल उदाहरण है। यह लिंक सीधे समर्थन करता है:

alt text

This recipe (बहुत सरल) प्रक्रिया दस्तावेजों और आप इसे कैसे अनुकूलित कर सकते हैं।

संबंधित मुद्दे