2009-06-03 13 views
10

मेरे पास एक बाध्य डेटाग्रिड व्यू है जिसमें बड़ी मात्रा में डेटा है। समस्या यह है कि कुछ कोशिकाओं को केवल पढ़ने के लिए और जब उपयोगकर्ता कोशिकाओं के बीच टैब या ENTER के साथ नेविगेट करता है, तो ReadOnly कोशिकाओं को बाईपास किया जाना चाहिए। कुछ विशिष्ट कोशिकाओं को बनाने का सबसे अच्छा तरीका क्या है लोडिंग के बाद केवल पढ़ने के लिए?डेटाग्रिड व्यू केवल कोशिकाओं को पढ़ता है

डेटासोर्स सेट करने के बाद कोशिकाओं के माध्यम से लूपिंग एक अच्छा विचार नहीं है कि ग्रिड में बड़ी मात्रा में डेटा है। साथ ही, सेलइंटर पर सेल को केवल पढ़ने के लिए काम नहीं करता है क्योंकि जब टैब कुंजी के साथ नेविगेट किया जाता है तो मुझे पहले से ही पता होना चाहिए कि अगला सेल केवल पढ़ने के लिए है या नहीं।

this.dgrid.Columns["colName"].ReadOnly = true; 

आप स्तंभ के भीतर व्यक्तिगत कोशिकाओं के लिए क्या करने की जरूरत है, तो आप पाश करने के लिए है और उन्हें इस तरह सेट हो जाएगा:

उत्तर

17

कोशिश केवल पढ़ने के लिए डेटा बाइंडिंग से पहले स्तंभ के बजाय व्यक्तिगत कोशिकाओं बनाने के लिए:

this.dgridvwMain.Rows[index].Cells["colName"].ReadOnly = true; 
+0

मैं नहीं, एक कॉलम के भीतर कोशिकाओं में से कुछ केवल पठनीय और दूसरों को नहीं हो सकता है कर सकते हैं। यह कुछ झंडे पर निर्भर करता है। –

+0

व्यक्तिगत कॉलम के लिए आपको लूप की आवश्यकता है और इसे सत्य पर सेट करना है। यह समय लेने वाला होगा, लेकिन मुझे नहीं लगता कि कोई अन्य विकल्प है। –

+2

.ReadOnly = true - हाँ, लेकिन यह डेटा बाइंडिंग पूर्ण होने के बाद किया जाना चाहिए। जैसे DataGridView.DataBindingComplete ईवेंट हैंडलर में। – Boogier

0

एक बार स्तंभ केवल पढ़ने के लिए (रश्मि की प्रतिक्रिया देखें) आप इस घटना को संभाल कर सकते हैं ...

private void dataGridView1_KeyPress(object sender, KeyPressEventArgs e) 
{ 
    if (e.KeyChar == (char)Keys.Tab) 
    { 
     Boolean readOnly = (sender as DataGridView).SelectedCells[0].ReadOnly; 

     return; 
    } 

} 

जो अगले सेल की केवल पढ़ने वाली संपत्ति प्राप्त करेगा।

धन्यवाद

+0

मैं केवल एक कॉलम पर नहीं डाल सकता क्योंकि एक ही कॉलम के भीतर से कुछ कक्ष केवल पढ़ा जा सकता है और अन्य नहीं। यह कुछ झंडे पर निर्भर करता है। –

+0

सबसे ज्यादा होने के लिए 100% निश्चित मौसम नहीं है कॉलम पढ़ा जा रहा है केवल मेरे द्वारा लिखे गए कोड को भी प्रभावित करेगा। यह कोशिश करने लायक हो सकता है ... –

1

मैंने यह कोशिश नहीं की है।

लेकिन, आप पंक्ति की घटना पर सेल की रीडोनली संपत्ति को सत्य (रश्मी के अनुसार) पर सेट कर सकते हैं?

मुझे लगता है कि जब आप एक पंक्ति से दूसरी पंक्ति में जाते हैं तो रोवर एंटर आग लगनी चाहिए (या जब आप सेल ए 1 से बी 3 में बदलते हैं)।

क्या इससे मदद मिलती है?

-2

वहाँ एक बहुत अच्छा यहाँ नमूना है:
http://blogs.msdn.com/netcfteam/archive/2006/04/25/583542.aspx

तुम बस Paint() ओवरराइड करने के लिए की जरूरत है, मैं कॉम्पैक्ट ढांचे पर इस का उपयोग किया है कक्ष सामग्री पर निर्भर करता है backcolor बदलने के लिए तो एक ही पर ध्यान दें कि आप shouldn ' उन्हें केवल पढ़ने के लिए कोई समस्या नहीं है।

+2

-1 समस्या को हल करने के लिए गलत तरीका। – siride

+0

लिंक केवल प्रतिक्रिया पोस्टिंग दिशानिर्देशों के खिलाफ हैं। एक पूर्ण उत्तर उपयोगकर्ता को समस्या को हल करने के लिए किसी अन्य पृष्ठ पर नेविगेट करने की आवश्यकता नहीं होगी। – orgtigger

-1

क्या आप बाध्य कॉलम के बजाय टेम्पलेट कॉलम का उपयोग नहीं कर सकते हैं तो फ़ील्ड की रीडोनियलिटी के लिए एक शर्त हो सकती है?

फिर आप संपादन के लिए केवल एक लेबल और टेक्स्टबॉक्स के लिए एक लेबल प्रस्तुत कर सकते हैं। लेबल आपके टैब इंडेक्स में हस्तक्षेप नहीं करेंगे।

<asp:TemplateColumn> 
    <ItemTemplate> 
<% 
    if (<%# Eval("ReadOnlyFlag") %>) 
    { 
%> 
    <asp:Label Text="<%# Eval("BoundColumn") %>" /> 
<% 
    } 
    else 
    { 
%> 
    <asp:Textbox Text="<%# Eval("BoundColumn") %>" /> 
<% 
    } 
%> 
    </ItemTemplate> 
</asp:TemplateColumn> 
+2

एएसपी.नेट में "डेटाग्रिड व्यू" नहीं है ... ओपी WinForms उत्तर के लिए पूछ रहा है। –

4

आप सेलबिजिन एडिट ईवेंट का उपयोग कर सकते हैं और सेल को अक्षम करने की आवश्यकता होने पर ई। कैंसल = सही सेट कर सकते हैं।

Private Sub DataGridView_CellBeginEdit(sender As System.Object, e As System.Windows.Forms.DataGridViewCellCancelEventArgs) Handles DataGridViewMsg.CellBeginEdit 
    If DataGridViewMsg.Rows(e.RowIndex).Cells("disable").Value = "Y" Then 
     e.Cancel = True 
    End If 
End Sub 
1
this.dataGridViewEmpList.EditMode = DataGridViewEditMode.EditProgrammatically; 
संबंधित मुद्दे