2010-10-01 20 views
8

WinForm DataGridView में, प्रारंभ होने पर यह स्वचालित रूप से पहली पंक्ति का चयन करता है। जब मैंने उस सुविधा को बंद करने की कोशिश की तो मुझे पागल कर दिया। डब्ल्यूपीएफ डाटाग्रिड में जाने पर, ऐसा लगता है कि माइक्रोसॉफ्ट ने इस सुविधा को बंद करने का फैसला किया है, जो मुझे लगता है कि एक अच्छी बात है। हालांकि, अब मुझे इस सुविधा को सक्षम करने में कठिन समय है। कुछ डेटाग्रिड के लिए, मैं डेटा बाध्यकारी के माध्यम से ग्रिड पॉप्युलेट होने के बाद स्वचालित रूप से पहली पंक्ति का चयन करना चाहता हूं। इंटरनेट में कुछ सुझाव हैं, लेकिन मैं यह काम नहीं कर सका। मैं यहां बेहतर भाग्य की उम्मीद करता हूं।WPF DataGrid प्रोग्रामेटिक रूप से पंक्ति या सेल का चयन कैसे करें?

उत्तर

9

IsSynchronizedWithCurrentItem = "true" सेट करें।

संपादित करें:

अपनी टिप्पणी करने के लिए, मुझे लगता है कि अपने डेटा ग्रिड के SelectionUnit "सेल" पर सेट है, यह क्या है? ठीक है, मुझे यकीन नहीं है कि यह सबसे अच्छा समाधान है, लेकिन एक चीज जो आप कर सकते हैं वह डेटाग्रिड के लिए लोडेड ईवेंट को संभालने और मैन्युअल रूप से चयनित सेल को कोड-बैक में सेट करना है।

<DataGrid x:Name="dg" AutoGenerateColumns="False" IsSynchronizedWithCurrentItem="True" 
      SelectedCellsChanged="dg_SelectedCellsChanged" SelectionUnit="Cell" 
      Loaded="dg_Loaded"> 
    ... 
</DataGrid> 

घटना हैंडलर:

private void dg_Loaded(object sender, RoutedEventArgs e) 
{ 
    if ((dg.Items.Count > 0) && 
     (dg.Columns.Count > 0)) 
    { 
     //Select the first column of the first item. 
     dg.CurrentCell = new DataGridCellInfo(dg.Items[0], dg.Columns[0]); 
     dg.SelectedCells.Add(dg.CurrentCell); 
    } 
} 

ध्यान दें कि यह केवल तभी DataGrid.SelectionUnit "सेल" पर सेट है काम करेंगे तो आप कुछ इस तरह होगा। अन्यथा, मुझे विश्वास है कि यह एक अपवाद फेंक देगा।

EDIT2:

XAML:

<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <StackPanel> 
     <Button Click="Button_Click">Reset</Button> 
     <DataGrid x:Name="dg" AutoGenerateColumns="False" IsSynchronizedWithCurrentItem="True" 
       SelectionUnit="Cell" 
       DataContextChanged="dg_DataContextChanged" 
       ItemsSource="{Binding Items}" 
       Loaded="dg_Loaded"> 
      <DataGrid.Columns> 
       <DataGridTextColumn Binding="{Binding}"/> 
      </DataGrid.Columns> 
     </DataGrid> 
    </StackPanel> 
</Window> 

कोड-पीछे:

namespace WpfApplication1 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
      this.LoadItems(); 
     } 

     private void Button_Click(object sender, RoutedEventArgs e) 
     { 
      this.LoadItems(); 
     } 

     private void LoadItems() 
     { 
      this.DataContext = new { Items = new List<string> { "Item1", "Item2", "Item3" } }; 
      this.SelectFirstItem(); 
     } 

     private void dg_Loaded(object sender, RoutedEventArgs e) 
     { 
      SelectFirstItem(); 
     } 

     void SelectFirstItem() 
     { 
      if ((dg.Items.Count > 0) && 
       (dg.Columns.Count > 0)) 
      { 
       //Select the first column of the first item. 
       dg.CurrentCell = new DataGridCellInfo(dg.Items[0], dg.Columns[0]); 
       dg.SelectedCells.Add(dg.CurrentCell); 
      } 
     } 

     private void dg_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e) 
     { 
      this.SelectFirstItem(); 
     } 
    } 
} 
+0

टिप के लिए बहुत बहुत धन्यवाद। मैंने बस कोशिश की। इसे सत्य पर सेट करने से डेटाग्रिड की पहली पंक्ति "हाइलाइट" हो जाएगी, लेकिन चयनित नहीं है। मुझे निकाल दिया गया चयनित CellsChanged घटना की जरूरत है। तो, मैं इस घटना को भी कैसे निकाल सकता हूं? – newman

+0

संपादित देखें। आशा करता हूँ की ये काम करेगा। – ASanch

+0

@karmicpuppet: यह कोड dg_Loaded घटना में काम करता है। हालांकि, यह DataContextChanged ईवेंट में काम करता है।अनिवार्य रूप से, एक ही ग्रिड का पुन: उपयोग किया जाता है। प्रत्येक बार जब डेटा डेटा संदर्भ सेट होता है, तो मैं पहली पंक्ति को स्वचालित रूप से चुनना चाहता हूं जो चयनितCellsChanged ईवेंट को ट्रिगर करना चाहिए क्योंकि मैं उस पर भरोसा कर रहा हूं। – newman

0

आप इस कोशिश कर सकते।

 this.dataGrid.SelectionMode = DataGridSelectionMode.Single; 

     // Selects the 4th row. 
     this.dataGrid.SelectedIndex = 3; 
+0

यह पंक्ति चयन के लिए है। –

+0

@ अवतार: मैंने अभी आपके सुझाव की कोशिश की है। ऐसा लगता है कि IsSynchronizedWithCurrentItem के समान प्रभाव है। तो, यह सिर्फ पंक्ति को हाइलाइट करता है, लेकिन मुझे SelectedCellsChanged ईवेंट नहीं मिलता है। दुर्भाग्य से, कोई "SelectedRowChanged" ईवेंट या ऐसा कुछ नहीं है। WinForm DataGridView की तुलना में, डब्ल्यूपीएफ डाटाग्रिड में बहुत कम घटनाएं हैं। – newman

+0

@ मिलियू चयनित कैल्स चेंज किए गए कार्यक्रम को ट्रिगर किया जाना चाहिए पता नहीं क्या समस्या है। मेरे पास एक नमूना है। कृपया इसे जांचें। इससे आपको कुछ विचार मिल सकता है। http://www.filefactory.com/file/b3bhf1d/n/DataGridCheckBoxSelection.zip –

1

मैं मैं ItemContainerGenerator.StatusChanged घटना के माध्यम से इस समस्या के लिए एक समाधान पाया रिपोर्ट करने के लिए खुश हूँ।

dataGrid.ItemContainerGenerator.StatusChanged += new EventHandler(ItemContainerGenerator_StatusChanged); 

void ItemContainerGenerator_StatusChanged(object sender, EventArgs e) 
     { 
      if (dataGrid.ItemContainerGenerator.Status == GeneratorStatus.ContainersGenerated) 
      { 
       dataGrid.SelectedIndex = 0; 
      } 
     } 

ऐसा लगता है कि इस घटना को स्थिति कंटेनर के साथ निकाल दिया गया है, डेटाग्रिड पूरी तरह से प्रारंभ किया गया है। मेरे लिए, यह WinForm में DataGridView के DataBindingComplete ईवेंट की तरह है। यदि ऐसा है, तो "DataContextChanged" ईवेंट को वास्तव में "DataContextChanging" ईवेंट कहा जाना चाहिए।

यह here पोस्ट से प्रेरित था, मैंने एक और सुराग की तलाश करते समय गलती से पाया।

+0

असल में, मुझे अभी एहसास हुआ कि ItemContainerGenerator_StatusChanged ईवेंट को कई बार निकाल दिया जा सकता है। मैं DataContextChanged ईवेंट पर वापस आ गया और इसे Dispatcher.BeginInvoke के माध्यम से काम किया। – newman

3

आप इसे डेटाग्रिड.लोडेड ईवेंट में लगातार कर सकते हैं। बस पहली पंक्ति प्राप्त करें और पंक्ति को चयन ईवेंट को आग लगाना है।

void MyGridLoaded(...) { 
DataGridRow r = yourGrid.ItemContainergenerator.ContainerFromIndex(0) as DataGridRow; 
    if(r != null) { 
    r.IsSelected = false; 
    r.IsSelected = true; 
    } 

} 

मुझे यकीन है कि यह एक बग है क्योंकि आप अपने वस्तु से चयन घटनाओं आग के लिए जब तक नियंत्रण भरी हुई है इसकी गारंटी नहीं किया जा सकता है नहीं कर रहा हूँ। क्या पता।

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