2009-06-12 10 views
7

में विभिन्न नियंत्रण प्रकार है यह एक DataGridView में निम्न करने के लिए संभव है:विंडोज फॉर्म्स DataGridView नियंत्रण उसी स्तंभ

उसी स्तंभ मैं DataGridViewTextBoxColumn और DataGridViewComboBoxColumn के बीच प्रत्येक पंक्ति के नियंत्रण प्रकार परिवर्तित करना चाहते है?

(ऐसा इसलिए है क्योंकि कभी-कभी मैं एक ड्रॉप डाउन सूची प्रदर्शित करना चाहता हूं और दूसरी बार मैं चाहता हूं कि उपयोगकर्ता फ्रीहैंड मान दर्ज करे)।

धन्यवाद,

पीएस मैं सी #

+0

बहुत अच्छा सवाल है। डेटाग्रिड व्यू क्लास का उपयोग करते समय यह किसी समस्या का सामना करने तक ही समय की बात है। – TheBlastOne

उत्तर

0

आप डेटाग्रिड व्यूसेल से विरासत में अपना स्वयं का वर्ग बना सकते हैं, और पर्याप्त वर्चुअल सदस्यों (प्रारंभिक संपादन संपादन, संपादन प्रकार, शायद कुछ अन्य) को ओवरराइड कर सकते हैं। इसके बाद आप

+0

इसके लिए धन्यवाद। सही ट्रैक की तरह लग रहा है। दुर्भाग्यवश मैं इस के लिए नया हूं और मैं कोशिकाओं को प्रकट नहीं कर सकता हूं इससे कोई फर्क नहीं पड़ता कि मैं क्या करता हूं। मैंने सुझाए गए एडिटटाइप को ओवरराइड कर दिया है। यदि मैं 'DataGridViewTextBoxCell' कहने का उत्तराधिकारी हूं तो मैं 'डेटाग्रिड व्यूसेल' से विरासत प्राप्त करने वाला सेल देख सकता हूं और टाइपटाफ (डेटाग्रिड व्यूटेक्स्टबॉक्स एक्सडिटिंग कंट्रोल) लौटने के लिए एडिटटाइप ओवरराइड कर रहा हूं, मुझे एक खाली सेल देता है - हालांकि मैं कॉलम देख सकता हूं। मुझे यकीन है कि कुछ स्पष्ट है जो मैंने याद किया है। –

+0

ऐसा लगता है कि दृश्य मोड नियंत्रण शून्य नहीं है या शून्य होने पर चौड़ाई है? मैं नियंत्रण में टैब कर सकता हूं, F2 दबा सकता हूं और एक मान टाइप कर सकता हूं। जब मैं बाहर निकलता हूं तो मैं इसे नहीं देख सकता, जब मैं संपादन मोड में वापस आता हूं तो यह अभी भी वहां है। –

+0

मुझे लगता है कि आपको PositionEditingPanel और PositionEditingControl को ओवरराइड करने की भी आवश्यकता है। लेकिन मैंने इसे कभी नहीं किया, इसलिए मैं केवल अनुमान लगा सकता हूं ... आपको मानक डेटाग्रिड व्यूसेल के लिए कोड देखने के लिए परावर्तक का उपयोग करना चाहिए, यह शायद आपको दिखाएगा कि आपको –

0

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

+0

टेम्पलेट कॉलम ASP.NET GridView के लिए हैं, WinForms DataGridView नहीं ... –

+0

आह, मेरा बुरा। यह कुछ समय हो गया है क्योंकि मैंने WinForms के साथ काम किया था। – atfergs

7

मैं हाल ही में एक ऐसी ही USECASE लिया है सेल टेम्पलेट के रूप में इस वर्ग का एक उदाहरण के साथ एक DataGridViewColumn बना सकते हैं और नीचे दिए गए कोड की तरह कुछ लिखने के समाप्त हो गया:

एक कस्टम सेल और कॉलम वर्ग लिखें , और सेल पर EditType और InitializeEditingControl तरीकों को ओवरराइड, उचित रूप में विभिन्न नियंत्रणों वापस जाने के लिए (यहाँ मैं सिर्फ क्या उपयोग करने के लिए नियंत्रण का संकेत .useCombo क्षेत्र के साथ एक कस्टम वर्ग की एक सूची के लिए डेटा बाइंडिंग कर रहा हूँ):

// Define a column that will create an appropriate type of edit control as needed. 
public class OptionalDropdownColumn : DataGridViewColumn 
{ 
    public OptionalDropdownColumn() 
     : base(new PropertyCell()) 
    { 
    } 

    public override DataGridViewCell CellTemplate 
    { 
     get 
     { 
      return base.CellTemplate; 
     } 
     set 
     { 
      // Ensure that the cell used for the template is a PropertyCell. 
      if (value != null && 
       !value.GetType().IsAssignableFrom(typeof(PropertyCell))) 
      { 
       throw new InvalidCastException("Must be a PropertyCell"); 
      } 
      base.CellTemplate = value; 
     } 
    } 
} 

// And the corresponding Cell type 
public class OptionalDropdownCell : DataGridViewTextBoxCell 
{ 

    public OptionalDropdownCell() 
     : base() 
    {   
    } 

    public override void InitializeEditingControl(int rowIndex, object 
     initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle) 
    { 
     // Set the value of the editing control to the current cell value. 
     base.InitializeEditingControl(rowIndex, initialFormattedValue, 
      dataGridViewCellStyle); 

     DataItem dataItem = (DataItem) this.OwningRow.DataBoundItem; 
     if (dataItem.useCombo) 
     { 
      DataGridViewComboBoxEditingControl ctl = (DataGridViewComboBoxEditingControl)DataGridView.EditingControl; 
      ctl.DataSource = dataItem.allowedItems; 
      ctl.DropDownStyle = ComboBoxStyle.DropDownList; 
     } 
     else 
     { 
      DataGridViewTextBoxEditingControl ctl = (DataGridViewTextBoxEditingControl)DataGridView.EditingControl; 
      ctl.Text = this.Value.ToString(); 
     } 
    } 

    public override Type EditType 
    { 
     get 
     { 
      DataItem dataItem = (DataItem)this.OwningRow.DataBoundItem; 
      if (dataItem.useCombo) 
      { 
       return typeof(DataGridViewComboBoxEditingControl); 
      } 
      else 
      { 
       return typeof(DataGridViewTextBoxEditingControl); 
      } 
     } 
    } 
} 

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

+0

+1, यह मेरे लिए काफी उपयोगी और साफ दिखता है। इस बारे में अच्छी बात यह है कि यह केवल संपादन समय नियंत्रण में "संपादन समय" के लिए आवश्यक संपादन नियंत्रण वर्ग को सिग्नल करता है, ग्रिड को कड़ी मेहनत करने देता है, और डेटाग्रिड व्यू.डिटिंग कंट्रोल का संदर्भ देकर तथाकथित संपादन नियंत्रण का उपयोग करता है। – TheBlastOne

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