2011-02-25 14 views
28

मैं डेटाग्रिड में किसी चयनित पंक्ति के प्रत्येक कॉलम के मान प्राप्त करने का प्रयास कर रहा हूं। मेरे पास यह है:डेटाग्रिड चयनित पंक्तियों के कॉलम मानों को प्राप्त करें

private void dataGrid1_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e) 
{ 
    DataGrid dg = sender as DataGrid; 
    Console.WriteLine(dg.SelectedCells[0].ToString()); 
} 

लेकिन यह काम नहीं करता है। अगर मैं SelectedCells.Count करता हूं तो मुझे कॉलम की सही संख्या मिलती है लेकिन मुझे वास्तव में चयनित पंक्ति में इन कॉलम के मान प्राप्त नहीं हो सकते हैं। मैंने भाग्य के साथ थोड़ी देर के लिए कोशिश की है!

<Grid> 
    <DataGrid CanUserAddRows="True" AutoGenerateColumns="False" Height="200" HorizontalAlignment="Stretch" Margin="12,12,79,0" Name="dataGrid1" VerticalAlignment="Top" Width="389" DataContext="{Binding}" CanUserResizeColumns="False" CanUserResizeRows="False" HorizontalContentAlignment="Stretch" PreviewMouseDoubleClick="dataGrid1_PreviewMouseDoubleClick" CellEditEnding="dataGrid1_CellEditEnding"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Binding="{Binding Path=UserID}" 
           Header="User ID" Width="SizeToHeader" /> 
      <DataGridTextColumn Binding="{Binding Path=UserName}" 
           Header="User ID" Width="SizeToHeader" /> 
     </DataGrid.Columns> 
    </DataGrid> 
</Grid> 

मैं आदर्श रूप rowData.UserID की तरह कुछ कर रही के माध्यम से डेटा का उपयोग करना चाहते हैं, लेकिन मैं इस पर काम नहीं कर पा रहे: यहाँ मेरी XAML है। डेटाग्रिड व्यू का उपयोग करने के लिए बहुत सारे ट्यूटोरियल और सहायता हैं लेकिन मैं इसका उपयोग नहीं कर रहा हूं।

+0

WPF, अद्यतन टैग । – Prisoner

+0

मेरी निष्कर्षों के अनुसार, सबसे आसान तरीका है समाधान: http://stackoverflow.com/a/42013760/7103438 –

उत्तर

51

UPDATED

चयनित पंक्तियों की कोशिश पाने के लिए:

IList rows = dg.SelectedItems; 

फिर आप एक पंक्ति आइटम से स्तंभ मान को पाने के लिए सक्षम होना चाहिए।

या

DataRowView row = (DataRowView)dg.SelectedItems[0]; 

तब:

row["ColumnName"]; 
+0

मैंने कहा जाना चाहिए था इस WPF है और वहाँ SelectedRows/SelectedRow – Prisoner

+0

होने के लिए दूसरा विकल्प मुझे देता प्रतीत नहीं होता: असमर्थ प्रकार 'iAdvert_Desktop.User' की वस्तु कास्ट करने के लिए 'System.Data.DataRowView' टाइप करने के लिए है और मैं काम करने के लिए या तो पहला विकल्प नहीं मिल सकता है: /। मैं सी # के लिए काफी नया हूँ। – Prisoner

+0

आप DataRowView बदल उपयोगकर्ता हो सकता है। देखें कि क्या यह करता है। मैं अनिश्चित था कि आपके सामान का प्रकार क्या था। –

2

मेरा मानना ​​है कि कारण वहाँ एक WPF डेटा ग्रिड के चयनित पंक्ति तक पहुँचने के लिए कोई सीधा संपत्ति है क्योंकि एक डेटा ग्रिड के चयन मोड हो सकता है या तो पंक्ति-स्तर या सेल-स्तर पर सेट करें। इसलिए, चयन-संबंधित गुण और घटनाएं सेल-स्तरीय चयन के खिलाफ लिखी गई हैं - ग्रिड के चयन मोड के बावजूद आप हमेशा कक्ष चुनते हैं, लेकिन आपको पंक्ति चुनने की गारंटी नहीं है।

मुझे पता नहीं है कि आप सेलएडिट एन्डिंग ईवेंट को संभालने के द्वारा क्या हासिल करने की कोशिश कर रहे हैं, लेकिन जब आप कोई पंक्ति चुनते हैं तो सभी चयनित कक्षों के मान प्राप्त करने के लिए, SelectedCellsChanged event को इसके बजाय संभालने पर एक नज़र डालें।

आप संभाल कर सकते हैं SelectedCellsChanged घटना अधिसूचित होने के लिए जब सेल चयनित संग्रह बदल गई है: विशेष रूप से उस लेख में की गयी टिप्पणी पर ध्यान दें। यदि चयन में पूर्ण पंक्तियां शामिल हैं, चयनकर्ता। चयन परिवर्तन ईवेंट भी उठाया गया है।

आप ईवेंट हैंडलर में SelectedCellsChangedEventArgs से AddedCells और RemovedCells प्राप्त कर सकते हैं।

आशा में मदद करता है कि आप सही रास्ते पर डाल दिया। :)

+0

ठीक है, कोड के इस टुकड़े का विचार मुझे अनुमति देने के लिए है: उपयोगकर्ता नाम संपादित करने के लिए क्लिक करें, फिर संपादन समाप्त होने पर मैं उस उपयोगकर्ता के उपयोगकर्ता आईडी के आधार पर मान को सहेजना चाहता हूं जो केवल पढ़ने के लिए है। तो मैं एक पंक्ति (ठीक है, केवल इस उदाहरण में UserID और उपयोगकर्ता नाम) के लिए सभी कोशिकाओं प्राप्त करने की आवश्यकता। – Prisoner

6

मैं कुछ इसी तरह की थी, लेकिन मैं बंधन का उपयोग चयनित आइटम प्राप्त करने के लिए:

<DataGrid Grid.Row="1" AutoGenerateColumns="False" Name="dataGrid" 
      IsReadOnly="True" SelectionMode="Single" 
      ItemsSource="{Binding ObservableContactList}" 
      SelectedItem="{Binding SelectedContact}"> 
    <DataGrid.Columns> 
    <DataGridTextColumn Binding="{Binding Path=Name}" Header="Name"/> 
    <DataGridTextColumn Binding="{Binding Path=FamilyName}" Header="FamilyName"/> 
    <DataGridTextColumn Binding="{Binding Path=Age}" Header="Age"/> 
    <DataGridTextColumn Binding="{Binding Path=Relation}" Header="Relation"/> 
    <DataGridTextColumn Binding="{Binding Path=Phone.Display}" Header="Phone"/> 
    <DataGridTextColumn Binding="{Binding Path=Address.Display}" Header="Addr"/> 
    <DataGridTextColumn Binding="{Binding Path=Mail}" Header="E-mail"/> 
    </DataGrid.Columns> 
</DataGrid> 

तो मैं अपने ViewModel में मेरी SelectedContact.Name पहुँच सकते हैं।

6

समाधान टोनी उत्तर के आधार पर:

 DataGrid dg = sender as DataGrid; 
     User row = (User)dg.SelectedItems[0]; 
     Console.WriteLine(row.UserID); 
+1

पुराना सवाल यह है, लेकिन मैंने चयनित इटम्स [0] को चयनित इटिम में बदल दिया ... लेकिन इससे मुझे बहुत मदद मिली! :) upvote! – Arrie

1

एक आसान तरीका है कि काम करता है:

private void dataGrid_SelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e) 
{ 
    foreach (var item in e.AddedCells) 
    { 
     var col = item.Column as DataGridColumn; 
     var fc = col.GetCellContent(item.Item); 

     if (fc is CheckBox) 
     { 
      Debug.WriteLine("Values" + (fc as CheckBox).IsChecked); 
     } 
     else if(fc is TextBlock) 
     { 
      Debug.WriteLine("Values" + (fc as TextBlock).Text); 
     } 
     //// Like this for all available types of cells 
    } 
} 
+0

मुझे लगता है कि यह ठीक है अगर आपके पास अपनी प्रत्येक कोशिका में चेकबॉक्स है। बेशक जहां नहीं है स्थिति की अनंत संख्या में ... – ouflak

1

एक WPF डेटा ग्रिड नियंत्रण पर चयनित पंक्ति से डेटा प्राप्त करने के लिए कैसे पर तरीके खोज के घंटे के बाद , क्योंकि मैं मोंगोडीबी का उपयोग कर रहा था। मुझे यह पोस्ट मिला और टोनी के जवाब का इस्तेमाल किया। मैंने अपनी परियोजना के लिए प्रासंगिक होने के लिए कोड संशोधित किया। शायद कोई इसका विचार पाने के लिए इसका इस्तेमाल कर सकता है।

private void selectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     facultyData row = (facultyData)facultyDataGrid.SelectedItem; 
     facultyID_Textbox.Text = row.facultyID; 
     lastName_TextBox.Text = row.lastName; 
     firstName_TextBox.Text = row.firstName; 
     middleName_TextBox.Text = row.middleName; 
     age_TextBox.Text = row.age.ToString(); 
    } 

} 

class facultyData 
{ 
    public ObjectId _id { get; set; } 
    public string facultyID { get; set; } 
    public string acadYear { get; set; } 
    public string program { get; set; } 
} 
1

डेटाग्रिड पंक्तियों के कॉलम मानों को चुनते हैं जिन्हें इसे नीचे कोड द्वारा एक्सेस किया जा सकता है। यहां ग्रिड 1 ग्रिड का नाम है।

private void Edit_Click(object sender, RoutedEventArgs e) 
{ 
    DataRowView rowview = grid1.SelectedItem as DataRowView; 
    string id = rowview.Row[0].ToString(); 
} 
0

मैं animescm sugestion का उपयोग कर इस समस्या को हल करने के लिए एक समान तरीके से इस्तेमाल किया, वास्तव में हम एक auxiliar सूची का उपयोग कर चयनित कोशिकाओं का एक समूह से विशिष्ट कोशिकाओं मान प्राप्त कर सकते हैं:

private void dataGridCase_SelectionChanged(object sender, SelectedCellsChangedEventArgs e) 
    { 
     foreach (var item in e.AddedCells) 
     { 
      var col = item.Column as DataGridColumn; 
      var fc = col.GetCellContent(item.Item); 
      lstTxns.Items.Add((fc as TextBlock).Text); 
     } 
    } 
संबंधित मुद्दे