2010-04-21 10 views
7

बनाम 2008 में Winforms का उपयोग करना। मेरे पास DataGridView है और मैं यह जानना चाहता हूं कि लंबवत स्क्रॉल बार कब दिखाई दे रहा है। मुझे किस कार्यक्रम के लिए पंजीकरण करना चाहिए?डेटाग्रिड व्यू नियंत्रण में लंबवत स्क्रॉलबार का पता लगाने के लिए

मैं ग्रिड के अंतिम कॉलम में प्रत्येक सेल मान को जोड़ रहा हूं और डेटाग्रिड व्यू के नीचे टेक्स्टबॉक्स में उस मान को प्रदर्शित कर रहा हूं।

मैं स्क्रॉल बार मौजूद होने के बावजूद भी इस टेक्स्टबॉक्स को सेल मानों के साथ रेखांकित करना चाहता हूं (मैंने उन्हें $$ मानों के बाद सही गठबंधन किया है)।

उत्तर

8

डीजीवी व्यवहार ओवरराइडिंग आमतौर पर गर्दन में एक बड़ा दर्द होता है। यद्यपि यह बहुत तेजी से जा रहा है। अपने फॉर्म में एक नई कक्षा जोड़ें और नीचे दिखाए गए कोड पेस्ट करें। संकलित करें। टूलबार के शीर्ष से नए फॉर्म को एक फॉर्म पर छोड़ दें। ScrollbarVisibleChanged घटना कार्यान्वित करें।

using System; 
using System.Windows.Forms; 

class MyDgv : DataGridView { 
    public event EventHandler ScrollbarVisibleChanged; 
    public MyDgv() { 
     this.VerticalScrollBar.VisibleChanged += new EventHandler(VerticalScrollBar_VisibleChanged); 
    } 
    public bool VerticalScrollbarVisible { 
     get { return VerticalScrollBar.Visible; } 
    } 
    private void VerticalScrollBar_VisibleChanged(object sender, EventArgs e) { 
     EventHandler handler = ScrollbarVisibleChanged; 
     if (handler != null) handler(this, e); 
    } 
} 
+0

आउच कि एक दर्द जब एक स्तंभ का आकार बदला जा चुका है पता लगाने के लिए हो रहा है दिखाया जा रहा है। – Billy

+4

@ बिली: हमेशा यह कहने की कोई गलती नहीं कि आपको वास्तव में कुछ क्यों चाहिए। डीजीवी के कॉलमविड्थ चेंजेड इवेंट का प्रयोग करें। –

0

मुझे लगता है कि अगर वहाँ के लिए लगता है कि किसी भी स्थिति ... लेकिन आप सभी स्थानों पर जहां ग्रिड बढ़ सकता है में कुछ इस तरह से कोशिश कर सकते हैं:

  • वास्तविक पंक्तियों की संख्या प्राप्त में ग्रिडव्यू + हेडर
  • प्रत्येक पंक्ति की ऊंचाई से उस संख्या को गुणा करें
  • यदि परिणाम डेटाग्रिड की ऊंचाई से अधिक है, तो एक लंबवत स्क्रॉलबार होना चाहिए।
0

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

/// <summary> 
    /// Horizontally shifts the label and text boxes that display the total 
    /// values so that the totals remain aligned with the columns. 
    /// </summary> 
    private void ShiftTotalsDisplay(DataGridView grid, Label firstLabel, 
    TextBox secondTextBox, TextBox thirdTextBox) 
    {   
    //Note if you have a rowheader add the width here also. 
    int nameRightLoc = grid.Location.X +    
     grid.Columns[0].Width; 
    int fpRightLoc = nameRightLoc + 
     grid.Columns[0].DividerWidth + 
     grid.Columns[1].Width; 
    int dlRightLoc = fpRightLoc + 
     grid.Columns[1].DividerWidth + 
     grid.Columns[2].Width; 

    Point loc = firstLabel.Location; 
    loc.X = nameRightLoc - firstLabel.Width - 2; 
    firstLabel.Location = loc; 

    loc = secondTextBox.Location; 
    loc.X = fpRightLoc - secondTextBox.Width - 2; 
    secondTextBox.Location = loc; 

    loc = thirdTextBox.Location; 
    loc.X = dlRightLoc - thirdTextBox.Width - 2; 
    thirdTextBox.Location = loc;   
    } 
20
var vScrollbar = dataGridView1.Controls.OfType<VScrollBar>().First(); 
if (vScrollbar.Visible) 
{ 
} 
+0

anwser जोड़ने के लिए धन्यवाद। मैं वर्तमान में लिंक सीख रहा हूं और जो शक्ति प्रदान करता है उससे प्यार करता हूँ! – Billy

+1

यह स्वीकार्य उत्तर होना चाहिए। स्क्रॉलबार गायब होने तक मैं अपने फॉर्म को दोबारा आकार देने के लिए अभी इसका उपयोग कर रहा हूं। –

0

अपने DGV एक पैनल के अंदर है तो आप पैनल और DGV ऊंचाई गुण तुलना कर सकते हैं। यदि डीजीवी पैनल की तुलना में बड़ा है तो एक स्क्रॉलबार होना चाहिए, है ना?

तरह:

int panel_height = pnl.Height; 
int dgv_height = (dgv.RowCount + 1) * 24; // You can play around with this 24 according to your cell styles 
if (dgv_height > panel_height) MessageBox.Show("Voila!"); 
0

DGV अंतिम स्तंभ के "AutoSizeMode" संपत्ति को "भरें" और पाठबॉक्स की चौड़ाई संपत्ति dgv.Columns [ "lastcolumn"] चौड़ाई के बराबर सेट सेट करें।।

1

लिंक (एडम बटलर) का उपयोग करने के बजाय आप केवल नियंत्रण के माध्यम से फिर से सक्रिय हो सकते हैं और एक ईवेंट हैंडलर साइन अप कर सकते हैं जिसे स्क्रॉलबार दृश्यता में हर बार बुलाया जाएगा। मैं इसे इस तरह से लागू किया और यह बहुत आसानी से काम करता है:

private System.Windows.Forms.DataGridView dgCounterValues; 
private Int32 _DataGridViewScrollbarWidth; 

// get vertical scrollbar visibility handler 
foreach (Control c in dgCounterValues.Controls) 
if (c.GetType().ToString().Contains("VScrollBar")) 
{ 
    c.VisibleChanged += c_VisibleChanged; 
} 

InitializeComponent() के बाद यह कहीं ऐसा हैंडलर में, जो कुछ भी आप खड़ी स्क्रॉलबार की दृश्यता परिवर्तन के जवाब में करने की आवश्यकता है। क्षैतिज स्क्रॉलबार (HScrollBar साथ VScrollBar की जगह) के लिए एक ही काम करता है: स्क्रॉलबार के कारण

void c_VisibleChanged(object sender, EventArgs e) 
{ 
    VScrollBar vb = sender as VScrollBar; 
    if (vb.Visible) _DataGridViewScrollbarWidth = vb.Width; 
    else _DataGridViewScrollbarWidth = 0; 
} 
+0

उन लोगों के लिए उपयोगी कोड जिनके पास .NET का प्री-लिंक संस्करण है। हालांकि मैं 'to (c.GetType()। बराबर (टाइपोफ (VScrollBar)))' 'ToString()' का उपयोग करने की तुलना में बेहतर समानता तुलना के रूप में सुझाव दूंगा। फोरच में एक 'ब्रेक' कथन भी इसे बेहतर बना देगा। – JPProgrammer

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