DataGridView AutoFit और भरें


85

मेरे पास 3 कॉलम हैं DataGridView। मैं जो करने की कोशिश कर रहा हूं उसमें सामग्री की चौड़ाई के लिए पहले 2 कॉलम ऑटो फिट हैं, और तीसरा कॉलम शेष स्थान को भरना है।

क्या WinForms में ऐसा करना संभव है? यदि मेरा कोई उपयोग है तो मैं अपना डेटा EF DataContext से लोड कर रहा हूं। मैंने एक छवि शामिल की है कि यह वर्तमान में कैसा दिखता है।

यहां छवि विवरण दर्ज करें

जवाबों:


168

आपको DataGridViewColumn.AutoSizeModeसंपत्ति का उपयोग करने की आवश्यकता है ।

आप स्तंभ 0 और 1 के लिए इनमें से किसी एक मान का उपयोग कर सकते हैं:

AllCells: कॉलम चौड़ाई हेडर सेल सहित कॉलम में सभी कोशिकाओं की सामग्री को फिट करने के लिए समायोजित करती है।
AllCellsExceptHeader: कॉलम की चौड़ाई हेडर सेल को छोड़कर कॉलम की सभी कोशिकाओं की सामग्री को फिट करने के लिए समायोजित करती है।
DisplayedCells: स्तंभ चौड़ाई स्तंभ में सभी कक्षों की सामग्री को फिट करने के लिए समायोजित करती है जो वर्तमान में ऑनस्क्रीन प्रदर्शित की गई पंक्तियों में हैं, जिनमें शीर्ष लेख सेल शामिल है।
DisplayedCellsExceptHeader: स्तंभ चौड़ाई स्तंभ में सभी कक्षों की सामग्री को फिट करने के लिए समायोजित होती है जो वर्तमान में ऑनस्क्रीन प्रदर्शित की गई पंक्तियों में हैं, शीर्ष लेख सेल को छोड़कर।

फिर आप कॉलम 2 के लिए भरण मूल्य का उपयोग करें

स्तंभ की चौड़ाई समायोजित हो जाती है ताकि सभी स्तंभों की चौड़ाई नियंत्रण के प्रदर्शन क्षेत्र को पूरी तरह से भर दे ...

this.DataGridView1.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
this.DataGridView1.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
this.DataGridView1.Columns[2].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;

जैसा कि अन्य उपयोगकर्ताओं द्वारा बताया गया है, डिफ़ॉल्ट मान को संपत्ति के datagridviewसाथ स्तर पर सेट किया जा सकता DataGridView.AutoSizeColumnsModeहै।

this.DataGridView1.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
this.DataGridView1.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;

हो सकता है:

this.DataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells;

महत्वपूर्ण लेख:

अपने ग्रिड एक डेटा स्रोत के लिए बाध्य है और स्तंभों स्वत: जनरेट (कर रहे हैं AutoGenerateColumnsसंपत्ति सही पर सेट), तो आप उपयोग करने की आवश्यकता DataBindingCompleteघटना शैली लागू करने के लिए बाद कॉलम बनाए गए हैं।


कुछ परिदृश्यों में (उदाहरण के लिए कोड द्वारा कोशिकाओं के मूल्य बदलें), मुझे DataGridView1.AutoResizeColumns();ग्रिड को ताज़ा करने के लिए कॉल करना था ।


1
DataBindingComplete इवेंट का उपयोग करते समय पूरी तरह से काम करता है।
जेम्स जेफ़री

डेटाग्रिड के आबाद होने के बाद मैं डेटाबिन्डिंग विधि को कॉल करने का तरीका नहीं बता सकता
दान

@Dan DataBindingComplete एक विधि नहीं है , यह एक डेटाग्रिड्यूव इवेंट है जिसके लिए आपको सदस्यता लेने की आवश्यकता है। यह उत्तर stackoverflow.com/a/31685874/2387010 एक उदाहरण देता है। क्या यह मदद करता है?
क्रिस

उदाहरण के बारे में बताया गया तो यह मददगार होगा, लेकिन पर्याप्त होगा। MSDN लेख है कि आप अपनी पोस्ट में से जुड़ा हुआ एक विधि है, जो है क्या मैं अपने पैटर्न के रूप में इस्तेमाल लेकिन समझ नहीं है कि यह कैसे कहा जाता हो जाता है के रूप में यह पता चलता है।
डैन

1
@ जानकारी है कि लापता जानकारी का टुकड़ा निश्चित रूप से उपयोगी है, धन्यवाद। मैं इस पुस्तक को पढ़ रहा हूं और सिर्फ प्रतिनिधियों और लंबोदा कार्यों पर अध्याय के लिए मिला है, इसलिए यह जल्द ही अधिक समझ में आएगा। धन्यवाद!
डेन

22

यह मेरा पसंदीदा तरीका है ...

_dataGrid.DataBindingComplete += (o, _) =>
    {
        var dataGridView = o as DataGridView;
        if (dataGridView != null)
        {
           dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
           dataGridView.Columns[dataGridView.ColumnCount-1].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
        }
    };

यदि स्तंभ का आकार = 0 है, तो उसे index out of bound exceptionठीक करें, धन्यवाद !!
तीयेबाम

14

बस नियंत्रण की संपत्ति से संपत्ति बदलें: AutoSizeColumnsMode:Fill

या कोड के द्वारा

dataGridView1.AutoSizeColumnsMode=DataGridViewAutoSizeColumnsMode.Fill;


1
धन्यवाद। मैं इस तरह एक समाधान की तलाश में था! :)
एलिन सियोकान

4

परीक्षण नहीं किया गया लेकिन आप एक कोशिश दे सकते हैं। परीक्षण किया और काम कर रहा है। मुझे आशा है कि आप के साथ खेल सकते हैं AutoSizeModeकी DataGridViewColumप्राप्त करने के लिए आप क्या जरूरत है।

सेटिंग का प्रयास करें

dataGridView1.DataSource = yourdatasource;<--set datasource before you set AutoSizeMode

//Set the following properties after setting datasource
dataGridView1.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
dataGridView1.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
dataGridView1.Columns[2].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;

यह काम करना चाहिए


यह काम नहीं करता है। जब डेटा स्रोत DataContext से जोड़े जाने से पहले प्रपत्र को प्रारंभ करता है, तो मैं इसे सेट कर रहा हूं। ऐसा क्यों हो सकता है? मुझे यकीन नहीं है कि इसे कहां सेट करना है क्योंकि डेटा को रन टाइम पर लोड किया गया है और कॉलम ईएफ मॉडल से लिए गए हैं।
जेम्स जेफरी

ऐसा लगता है, लेकिन नहीं, तीसरी पंक्ति काम नहीं करती है, मैंने 10 मिनट पहले यह परीक्षण किया था।
राजा राजा

@JamesJeffery आप स्वतः कॉलम कॉलम या मैन्युअल रूप से आबाद कर रहे हैं?
श्रीराम सक्तीवेल

@SriramSakthivel मैं अपने DataContext से लौटी सूची को बाँधने के लिए dataGridView1.DataSource संपत्ति का उपयोग कर रहा हूँ।
जेम्स जेफ़री


0
public static void Fill(DataGridView dgv2)
   {
        try
        {
            dgv = dgv2;
            foreach (DataGridViewColumn GridCol in dgv.Columns)
            {
                for (int j = 0; j < GridCol.DataGridView.ColumnCount; j++)
                {
                    GridCol.DataGridView.Columns[j].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
                    GridCol.DataGridView.Columns[j].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
                    GridCol.DataGridView.Columns[j].FillWeight = 1;
                }
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }

1
यह कोड महान नहीं है। सबसे पहले आपको नेस्टेड लूप की आवश्यकता नहीं है, जो सभी कॉलमों की चौड़ाई मोड को एक ही चीज़ कई (<कॉलम का नंबर>) बार सेट करता है; आप प्रत्येक कॉलम के AutoSizeMode और FillWeight गुणों को सीधे एक्सेस कर सकते हैं GridCol। दूसरा यह प्रत्येक कॉलम के लिए दो अलग-अलग मानों के लिए AutoSizeMode सेट कर रहा है; दूसरा असाइनमेंट पहले ओवरराइट करेगा।
जॉनपी

0

अल्फ्रेडब्र के उत्तर पर निर्माण करने के लिए, यदि आप अपने कुछ स्तंभों को छिपाते हैं, तो आप निम्नलिखित सभी कॉलमों को ऑटो-आकार में उपयोग कर सकते हैं और फिर अंतिम रिक्त कॉलम को खाली जगह भरें।

myDgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
myDgv.Columns.GetLastColumn(DataGridViewElementStates.Visible, DataGridViewElementStates.None).AutoSizeMode = 
    DataGridViewAutoSizeColumnMode.Fill;

0

कॉलम "First_name" प्राप्त करने के लिए मैंने यही किया है, जब सभी कॉलम ऐसा नहीं कर सकते हैं तो स्थान भरें।

जब ग्रिड छोटे कॉलम में जाता है "First_name" लगभग अदृश्य (बहुत पतला) हो जाता है तो मैं DataCridViewAutoSizeColumnMode को अन्य दृश्यमान कॉलम के रूप में AllCells पर सेट कर सकता हूं। प्रदर्शन के मुद्दों के लिए यह महत्वपूर्ण है कि उन्हें डेटा बाइंडिंग से पहले किसी को भी सेट न किया जाए और ग्रिड के डेटाबाइंडक्लास इवेंट हैंडलर में AllCell पर वापस सेट कर दिया जाए। आशा है कि इससे सहायता मिलेगी!

private void dataGridView1_Resize(object sender, EventArgs e)
    {
        int ColumnsWidth = 0;
        foreach(DataGridViewColumn col in dataGridView1.Columns)
        {
            if (col.Visible) ColumnsWidth += col.Width;
        }

        if (ColumnsWidth <dataGridView1.Width)
        {
            dataGridView1.Columns["first_name"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
        }
        else if (dataGridView1.Columns["first_name"].Width < 10) dataGridView1.Columns["first_name"].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
    }

-1
public void setHeight(DataGridView src)
{
    src.Height= src.ColumnHeadersVisible ? src.ColumnHeadersHeight : 0 +   src.Rows.OfType<DataGridViewRow>().Where(row => row.Visible).Sum(row => row.Height);
}

बस उस फ़ंक्शन को कॉल करें, इसमें पंक्तियों की संख्या के आधार पर
डेटाग्रिड्यूव

1
सबसे पहले, यह ओपी के सवाल का जवाब नहीं देता है। इसके अलावा (भविष्य के संदर्भ के लिए) उत्तर पर स्वयं ऐसी टिप्पणी शामिल करें (आप इसे संपादित कर सकते हैं)।
जोएल

-2

इसे इस्तेमाल करे :

  DGV.AutoResizeColumns();
  DGV.AutoSizeColumnsMode=DataGridViewAutoSizeColumnsMode.AllCells;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.