2010-01-30 19 views
6

मैं DevExpress द्वारा बनाए गए एक्स्ट्राग्रिड सूट के साथ काम कर रहा हूं। मुझे ऐसा करने के लिए किसी प्रकार की कार्यक्षमता नहीं मिल रही है, लेकिन अगर आप एक ग्रिड सेल में बटन या हाइपरलिंक जोड़ सकते हैं तो मुझे उत्सुकता है।एक्सट्रैड सूट - क्या सेल में बटन या हाइपरलिंक जोड़ने का कोई तरीका है?

संदर्भ: मुझे एक ईवेंट सूची मिली है। प्रत्येक कार्यक्रम में एक समय, प्रारंभ/अंत, और एक श्रेणी (उपयोगिता और रखरखाव) होता है। ईवेंट शुरू करें और घटनाओं को रोकें। समस्या का मेरा विश्लेषण करने के बाद, मैंने फैसला किया है कि प्रत्येक कार्यक्रम के लिए स्टार्टटाइम और एंडटाइम होने पर काम नहीं होगा।

तो यदि कोई ईवेंट शुरू होता है, तो मैं ईवेंट ऑब्जेक्ट पर वर्तमान समय रिकॉर्ड करता हूं, और इसे 'स्टार्ट' ईवेंट के रूप में सेट करता हूं। मैं उस पंक्ति में किसी सेल को "रोकें" बटन/हाइपरलिंक जोड़ना चाहता हूं। यदि उपयोगकर्ता एक एंड इवेंट लॉग करना चाहता है, तो ईवेंट प्रकार इत्यादि को 'स्टॉप' प्रकार के साथ एक नए ईवेंट में कॉपी किया जाएगा और बटन गायब हो जाएगा।

मुझे उम्मीद है कि यह समझ में आता है।

संपादित करें: Aaronaught का जवाब वास्तव में क्या मैं मूल रूप से (एक बटन) पूछ रहा था की तुलना में बेहतर है तो मैं सवाल नवीनीकृत किया है। इस तरह, कोई भी सेल में हाइपरलिंक डालने की तलाश में अपने उदाहरण से लाभ उठा सकता है:)

उत्तर

15

मैं ड्रॉइंग कोड को ओवरराइड करके और माउस चाल/क्लिक ईवेंट को संभालने के द्वारा हाइपरलिंक-शैली टेक्स्ट का उपयोग करना पसंद करता हूं, क्योंकि बटन स्केल नहीं करते हैं एक ग्रिड की सामान्य पंक्ति ऊंचाई के लिए बहुत अच्छी तरह से। हालांकि, यदि कोई बटन वास्तव में आप चाहते हैं, तो आपको RepositoryItemButtonEdit का उपयोग करके संपादक प्रकार के रूप में ऐसा करने में सक्षम होना चाहिए।

यदि आप पूर्व में रुचि रखते हैं, तो एक टिप्पणी छोड़ दो और मैं इसे एक उदाहरण के साथ अपडेट करूंगा। अन्यथा, जैसा कि बताया गया है, बस RepositoryItemButtonEdit का उपयोग करें। यदि आप चाहें तो पूरे सेल को लेने के लिए आप अपनी गुणों को बदल सकते हैं, और फिर कॉलम को एक निश्चित आकार बना सकते हैं ताकि बटन खींच न सके।


अद्यतन: मैं नीचे "सुंदर हाइपरलिंक" के लिए कुछ नमूना कोड है, जो मैं एक बहुत एक मानक हाइपरलिंक सेल से बेहतर लगता है पोस्टिंग कर रहा हूँ क्योंकि (क) यह अच्छा लग रहा है, (ख) यह देता है होवर फीडबैक, और (सी) यदि आप चाहें तो कर्सर बदल सकते हैं (मैं ओएस से देशी हाथ कर्सर प्राप्त करने के लिए उपयोगिता विधि का उपयोग करता हूं, जिसमें Winforms के अंतर्निर्मित हाथ से अधिक 3 डी लुक है)।

गैर-देवएक्सप्रेस उपयोगकर्ताओं को यह पढ़ने के लिए नोट: मैं मानक System.Windows.Forms.ListView के लिए लगभग एक समान तकनीक का उपयोग करता हूं। माइक्रोसॉफ्ट विस्टा और विंडोज 7 में इस यूआई पैटर्न का काफी उपयोग करता है और यह सीखना अच्छा होता है कि कैसे करना है, भले ही परिणाम सही प्रतिकृति न हो।

private int hoverRowHandle = GridControl.InvalidRowHandle; 

private void gridView_Click(object sender, EventArgs e) 
{ 
    if (hoverRowHandle != GridControl.InvalidRowHandle) 
    { 
     MyItem item = gridView.GetRow(hoverRowHandle) as MyItem; 
     if (item != null) 
      // Do whatever the "click" action is here 
    } 
} 

private void gridView_CustomDrawCell(object sender, 
    RowCellCustomDrawEventArgs e) 
{ 
    if (e.Column == linkColumn) 
    { 
     bool hover = (hoverRowHandle == e.RowHandle); 
     FontStyle style = hover ? FontStyle.Underline : FontStyle.Regular; 
     TextFormatFlags formatFlags = 
      TextFormatFlags.Left | TextFormatFlags.VerticalCenter | 
      TextFormatFlags.WordEllipsis; 
     Color foreColor = gridView.IsRowSelected(e.RowHandle) ? 
      Color.White : (hover ? MyColors.LinkHover : MyColors.Link); 
     using (Font font = new Font(gridControl.Font, style)) 
     { 
      TextRenderer.DrawText(e.Graphics, "Link Text", font, e.Bounds, 
       foreColor, formatFlags); 
     } 
     e.Handled = true; 
    } 
} 

private void gridView_MouseLeave(object sender, EventArgs e) 
{ 
    int tempRowHandle = hoverRowHandle; 
    hoverRowHandle = GridControl.InvalidRowHandle; 
    if (tempRowHandle != GridControl.InvalidRowHandle) 
    { 
     gridView.InvalidateRowCell(tempRowHandle, linkColumn); 
    } 
} 

private void gridView_MouseMove(object sender, MouseEventArgs e) 
{ 
    int tempRowHandle = hoverRowHandle; 
    if (tempRowHandle != GridControl.InvalidRowHandle) 
    { 
     hoverRowHandle = GridControl.InvalidRowHandle; 
     gridView.InvalidateRowCell(tempRowHandle, linkColumn); 
    } 
    GridHitInfo hitInfo = gridView.CalcHitInfo(e.Location); 
    if (hitInfo.InRowCell && (hitInfo.Column == linkColumn)) 
    { 
     hoverRowHandle = hitInfo.RowHandle; 
     gridView.InvalidateRowCell(hoverRowHandle, linkColumn); 
    } 

    bool hoverDetail = (hoverRowHandle != GridControl.InvalidRowHandle); 
    gridControl.Cursor = hoverDetail ? Cursors.Hand : Cursors.Default; 
} 

इस कोड के बारे में कुछ नोट:

  • MyItem डेटा के जो भी प्रकार आप ग्रिड दृश्य करने के लिए बाध्य किया है। हो सकता है कि यह DataRow है, या हो सकता है कि यह कुछ कस्टम प्रकार है यदि डेटा स्रोत IList<T> है।

  • MyColors एक उपयोगिता वर्ग है जो यूआई सामान के लिए उपयोग किए गए public static readonly Color फ़ील्ड को परिभाषित करता है। यदि आप कभी भी एक ग्रिड पर ऐसा करने जा रहे हैं तो आप हार्ड-कोड वाले रंगों के साथ संदर्भों को प्रतिस्थापित कर सकते हैं।

  • मुझे Font कैशिंग को परेशान नहीं करते हैं, हालांकि आप शायद ही कर सकते हैं, क्योंकि उनमें से केवल दो ही हैं।

  • कर्सर तर्क किसी अन्य कर्सर तर्क के साथ गड़बड़ कर देगा जो आप ग्रिड में उपयोग कर सकते हैं (जो लगभग मेरे लिए लगभग हर मामले में नहीं है, इसलिए आम तौर पर आपको ठीक होना चाहिए)।

  • आप एक से अधिक "लिंक कॉलम" करना चाहते हैं, तो आप hoverRowHandle के अलावा एक hoverColumn राज्य क्षेत्र को बनाए रखने, और स्पष्ट रूप से एकाधिक स्तंभों के लिए खोज करने के लिए उन एकल-स्तंभ समानता तुलना बदलने की जरूरत है।

मेरे अपने Winforms ऐप के लिए, मैं वास्तव में एक एक्सटेंडर प्रदाता मुझे स्तंभ नाम/लिंक पाठ जोड़ों की सूची में घालना द्वारा एक GridView या ListView को यह व्यवहार अनुलग्न करने देता है कि है, लेकिन है कि कोड सिर्फ एक सुबह है यहां पोस्ट करने के लिए बहुत लंबा समय। ऊपर दिया गया उदाहरण आपको शुरू करना चाहिए।

+0

धन्यवाद, मैं हाइपरलिंक के exmple को देखने के लिए अच्छा लगेगा। इस बीच, मैं 'RepositoryItemButtonEdit' काम कर रहा हूँ। –

+1

@ कैलिको-बिल्ली: यहां आप वादा किए गए हैं! – Aaronaught

+2

इस उत्तर में आपके द्वारा किए गए सभी प्रयासों के लिए बहुत बहुत धन्यवाद। काश मैं इसे एक से अधिक बार बढ़ा सकता हूं! –

5

RepositoryItemButtonEdit का उपयोग करें और TextEditStyle से HideTextEditor पर सेट करें।

1

आप रिपोजिटरीआईटमबटन एडिट: का उपयोग कर सकते हैं "गुण" में "लक्ष्य" में अपने लक्ष्य कॉलम का चयन करें, "कॉलमएडिट" पर क्लिक करें और "बटन एडिट" का चयन करने के बाद "नया" चुनें। अपने ग्रिड पर क्लिक करें और "रन डिजाइनर" का चयन करें, "रिपोजिटरी" समूह पर "इन-प्लेस संपादक रिपोजिटरी" का चयन करें। "repositoryItemButtonEdit1" चुनें (यदि आपने बटन को घटक नाम संपादित नहीं किया है) "ईवेंट" टैब का चयन करें और "बटन दबाए" ईवेंट का चयन करें। इस घटना में अपना कोड भरें। यदि आप चाहते हैं, घटक के संपादक भाग को छुपाएं, "गुण" में लक्ष्य कॉलम का चयन करें, "ColumnEdit" पर क्लिक करें "TextEditStyle" और "HideTextEditor" चुनें।

लेकिन, एक सवाल !?? मैं अपने बटन में एक तस्वीर जोड़ना चाहता हूं, किसी को कोई विचार है?

+0

मैं इसे एक के रूप में पोस्ट करूंगा नया सवाल –

1

अब यह रिपोजिटरीइटम हेपरलिंक संपादन नियंत्रण का उपयोग करके हासिल किया जा सकता है।

देखें: प्रस्ताव के लिए RepositoryItemHyperLinkEdit Class

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