2010-01-25 10 views
6

मैं सिल्वरलाइट 3.0 डेटाग्रिड में एक विशिष्ट सेल चुनने और इसे संपादन मोड में रखने में सक्षम होना चाहता हूं। मैं सेल का पता लगाने के लिए VisualTreeManager का उपयोग कर सकते हैं। मैं संपादन मोड में कैसे स्विच करूं? पाठ मैं संपादित करना चाहते हैं TextBlock साथमैं सिल्वरलाइट 3 डेटाग्रिडसेल को कोड में संपादन मोड में कैसे रख सकता हूं?

  System.Windows.Controls.DataGridCell 
      System.Windows.Controls.Grid 
       System.Windows.Shapes.Rectangle 
       System.Windows.Controls.ContentPresenter 
       System.Windows.Controls.TextBlock 
       System.Windows.Shapes.Rectangle 
       System.Windows.Shapes.Rectangle 

:

प्रत्येक DataGridCell VisualTreeManager में इस तरह दिखता है।

अद्यतन

@AnthonyWJones 'सुझाव के बाद, यहाँ कैसे मैं इस BeginEdit का उपयोग कर करने की कोशिश की है()।

मैं इसे सरल रखना चाहता था इसलिए मैंने सोचा कि मैं पहली पंक्ति में एक कॉलम चुनूंगा। यहां तक ​​कि मेरे एसएल ज्ञान से परे साबित हुआ! अंत में, मैं एक क्षेत्र इसे पकड़ firstRow बुलाया बनाकर पहली पंक्ति मिलती है:

private DataGridRow firstRow; 

डेटा ग्रिड के लिए एक LoadingRow हैंडलर कहा:

LoadingRow="computersDataGrid_LoadingRow" 

और

private void computersDataGrid_LoadingRow(object sender, DataGridRowEventArgs e) 
{ 
    if (this.firstRow == null) 
     this.firstRow = e.Row; 
} 

और फिर संपादन को ट्रिगर करने के लिए पैनल में एक बटन जोड़ना:

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    this.dataGrid.SelectedItem = this.firstRow; 
    this.dataGrid.CurrentColumn = this.dataGrid.Columns[4]; 
    this.dataGrid.BeginEdit(); 
} 

मैं बटन क्लिक करता हूं और सही सेल चुना जाता है लेकिन यह सेल पर संपादित नहीं होता है। यह प्राप्त करने के लिए मैन्युअल क्लिक लेता है।

उत्तर

2

मुझे यकीन नहीं है कि आपको VisualTreeManager का उपयोग करके DataGridCell क्यों ढूंढना है और न ही मुझे पता है कि आप वास्तव में संपादन कैसे शुरू करेंगे। आप सेल के दृश्य स्थिति को संपादित करने के लिए बस सेट कर सकते हैं।

VisualStateManager.GoToState(myDataGridCell, "Editing", true); 

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

"मानक" दृष्टिकोण आइटम पंक्ति से दिखाया को DataGridSelectedItem गुण सेट करने के लिए हो सकता है, DataGridColumn उद्देश्य यह है कि स्तंभ जिसमें सेल पाया जाता है का प्रतिनिधित्व करता है के लिए CurrrentColum गुण सेट। फिर BeginEdit विधि पर कॉल करें।

+0

मैं किसी और के द्वारा इस मार्ग नीचे का नेतृत्व कर रहा था। मैंने जो सुझाव दिया है उसके साथ मैं जाऊंगा और आपको बता दूंगा। धन्यवाद। – ssg31415926

+0

मैंने सफलता के बिना आपके दोनों सुझावों का प्रयास किया है। सबसे पहले, "मानक" दृष्टिकोण। चयनित इटैम और करंट कॉलम का उपयोग करने से सेल को हाइलाइट किया जा रहा है लेकिन BeginEdit() को कोई प्रभाव नहीं पड़ता है। सेल को फोकस नहीं मिलता है और संपादन मोड में नहीं जाता है। VisualStateManager का उपयोग करना, या तो काम नहीं किया था। – ssg31415926

+0

@ ssg31415926 मुझे संदेह था कि पहला दृष्टिकोण काम नहीं करेगा, मैं आश्चर्यचकित हूं कि दूसरा ऐसा नहीं था, क्या आप अपने प्रश्न को संपादित कर सकते हैं जिसमें प्रासंगिक कोड की एक छोटी राशि शामिल है जिसमें वर्णन किया गया है कि आपने यह कैसे किया है? – AnthonyWJones

0

मैं आपकी समस्या को ठीक से समझ नहीं पा रहा हूँ, लेकिन मैं एक ऐसी ही समस्या थी

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

  • मार्क पूरे ग्रिड की कोशिकाओं लिखने योग्य, IsReadOnly के रूप में झूठी
  • घटना PreparingCellForEdit निर्धारित करें और जब आप एक सेल पर डबल क्लिक करें, यह संपादन मोड
  • चेक कि क्या में हो जाता है एक कॉलबैक
  • भेज रहे हैं इस सेल आप तो है कि सेल ReadOnly है, आगे बढ़ो
  • संपादन योग्य
  • यह संपादित करने के लिए अनुमति दी है होना चाहता हूँ, तो फोन CancelEdit

नमूना कोड चला जाता है

तरह
namespace foo 
{ 
    public class foobar 
    { 
     public foobar() 
     { 
      sampleGrid = new DataGrid(); 
      sampleGrid.IsReadOnly = false; 
      sampleGrid.PreparingCellForEdit += new EventHandler<DataGridPreparingCellForEditEventArgs>(sampleGrid_PreparingCellForEdit); 
     } 

     void sampleGrid_PreparingCellForEdit(object sender, DataGridsampleGrid_PreparingCellForEditEventArgs e) 
     { 
      if (sampleGrid.SelectedItem != null) 
      { 
       bool isWritableField = CheckIfWritable() 

       if (isWritableField == false) 
       { 
        sampleGrid.CancelEdit(); 
       } 

       // continue with your logic 
      } 
     } 

     private DataGrid sampleGrid; 
    } 
} 
+0

कोई विचार क्यों CancelEdit काम नहीं कर सकता है? – neurotix

+0

@neurotix यह काम नहीं करता है? वास्तव में? यह मेरे लिए करता है। सिल्वरलाइट 3. मुझे नहीं लगता कि यह एसएल 4 –

+0

के लिए बदलना चाहिए: यह मेरे लिए कोई प्रभाव नहीं देता है :(मैंने भी उसी चीज को हासिल करने की कोशिश की है जैसा आपने यहां किया है, जिसे आपने IsReadOnly Dinamically बदलकर किया है, लेकिन यह भी यादृच्छिक रूप से विफल रहता है। जांचने की देखभाल: http://stackoverflow.com/questions/9311158/datagrid-column-isreadonly-property-not-working-in-silverlight-4 – neurotix

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