C# 从DataGrid WPF C中的选定行获取特定单元格的数据#

C# 从DataGrid WPF C中的选定行获取特定单元格的数据#,c#,wpf,checkbox,datagrid,C#,Wpf,Checkbox,Datagrid,我有一个DataGrid,我用sql数据库中的数据填充它。 现在我想从我用复选框选择的行中获取一个特定的单元格(第二个单元格) 这就是我现在拥有的: WPF XAML: <DataGrid Name="myGrid"> <DataGrid.Columns> <DataGridTemplateColumn> <DataGridTemplateColumn.CellTemplate>

我有一个DataGrid,我用sql数据库中的数据填充它。 现在我想从我用复选框选择的行中获取一个特定的单元格(第二个单元格)

这就是我现在拥有的: WPF XAML:

<DataGrid Name="myGrid">
    <DataGrid.Columns>
        <DataGridTemplateColumn>
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <CheckBox Checked="CheckBox_Checked"/>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    <DataGridTextColumn Header="CustomerID" Width="Auto" Binding="{Binding CustomerID}"/>
    <DataGridTextColumn Header="ItemID" Width="Auto" Binding="{Binding ItemID}"/>
<DataGrid>
我在运行时出错:

System.ArgumentOutOfRangeException

{“索引超出范围。必须为非负且小于集合的大小。\r\n参数名称:索引”}

我做错了什么?我是否必须使用另一种方法来获得我想要的单元?

MVVM模式

您的XAML:

<DataGrid Name="myGrid" Grid.Row="1"  SelectionMode="Single" AutoGenerateColumns="False" CanUserAddRows="True" ItemsSource="{Binding YourCollection}" IsReadOnly="True" Background="#FFB8C1CB">
<DataGrid.Columns>

        <DataGridTextColumn Header="ID" Binding="{Binding yourColumnItem}" />

    </DataGrid.Columns>
</DataGrid>
您的DelegateCommand类:

using System;
using System.Windows.Input;

namespace yourSolution.ViewModel
{

public class DelegateCommand : ICommand
{
    private readonly Action<Object> _Execute; 
    private readonly Func<Object, Boolean> _CanExecute; 


    public DelegateCommand(Action<Object> execute) : this(null, execute) { }


    public DelegateCommand(Func<Object, Boolean> canExecute, Action<Object> execute)
    {
        if (execute == null)
        {
            throw new ArgumentNullException("execute");
        }

        _Execute = execute;
        _CanExecute = canExecute;
    }


    public event EventHandler CanExecuteChanged;


    public Boolean CanExecute(Object parameter)
    {
        return _CanExecute == null ? true : _CanExecute(parameter);
    }


    public void Execute(Object parameter)
    {
        _Execute(parameter);
    }


    public void RaiseCanExecuteChanged()
    {
        if (CanExecuteChanged != null)
            CanExecuteChanged(this, EventArgs.Empty);
    }
}
}

我希望这涵盖了一切。当然,您需要EventHandler来与App.xaml.cs通信,但我不知道您在处理手机后想做什么。我只做了3次,希望能成功。

如果我理解正确,您希望从属性的选定行中获取值,该属性的数据绑定到
数据网格的第二列。但是,您向我们展示的代码没有做到这一点:

这应该是

YourDataType row = myGrid.SelectedItems[0];
。。。因为
SelectedItems
属性返回所选集合中的项目。一旦您从所选行中获得了数据项,那么您需要做的就是从中访问所需的属性。。。我相信您在查找
ItemID
属性值:

int ItemId = row.ItemID;

我终于找到了!很简单

DataRowView drv = (DataRowView)myGrid.SelectedItem; 
String result = (drv["CustomerID"]).ToString(); 
MessageBox.Show(result);

使用此选项可以100%工作

object item = dataGrid1.SelectedItem;
           string ID = (dataGrid1.SelectedCells[0].Column.GetCellContent(item) as TextBlock).Text;

在wpf中,这一个对我有效

<DataGrid Name="dataGridShowStudents">
</DataGrid>

private void dataGridShowStudents_MouseDoubleClick(object sender, MouseButtonEventArgs e){
        DataRowView drv = (DataRowView)dataGridShowStudents.SelectedItem;
        string result = drv[0].ToString();
        MessageBox.Show(result);
    }

私有void dataGridShowStudents_MouseDoubleClick(对象发送器,MouseButtonEventArgs e){
DataRowView drv=(DataRowView)dataGridShowStudents.SelectedItem;
字符串结果=drv[0]。ToString();
MessageBox.Show(结果);
}

例如,如果要在文本框中使用单元格值。

需要哪个单元格数据?根据发布的XAML,它只包含一个带有复选框的单元格。我在DataGrid中看不到任何数据?它是如何填充的?我遗漏了一些代码,认为没有必要@GáborBirkás@thbl您正在使用MVVM模式吗?为什么不将DataGrid上下文绑定到包含数据库行的ObservableCollection?如果你愿意,我可以给你代码。是的,请@GáborBirkás,希望我能让它工作。谢谢你的麻烦,但我似乎无法让它工作。我认为从数据网格中提取一个单元格是非常简单的。-1表示完全不必要且过于复杂的答案。你不需要95%的答案。。。问题作者只是想从他们的
DataGrid
中获取一个值,而不是学习MVVM。。。他们甚至没有添加MVVM标签,也没有在问题的任何地方提到它。我们的目的是帮助问题作者,而不是不必要地混淆他们。@Sheridan如果你查看我对原始问题的评论,你会发现我特别问作者是否需要MVVM模式的答案。在其他任何情况下,我都不会给出冗长的回答。伙计,我只是想帮助编写一些代码,顺便说一下,这些代码包含一个完全可重用的委托命令类。我不需要写下如何读入数据库中的内容,这是为了清理问题。顺便说一句,我自己在这里问了一些问题,对其中一半的回答是,为什么你需要这个?等等。不是实际的帮助或代码。有趣的社区。你提出了一个很好的观点,回头看,我想投票给一个用户“超过回答”一个问题是愚蠢的。。。这比许多用户“回答不足”的问题要好。然而,我相信我的观点是。。。如果你看问题作者的答案,你也应该看到。这个问题的答案太多了。话虽如此,我发现你是一个比较新的人,想要鼓励那些愿意花时间提供完整答案的用户,我已经完全改变了主意。因此,为之前的和+1的回答和理由表示歉意。@Sheridan非常感谢!能遇到重视事物的男人真是太好了。现在我对我所说的社区感到很难过。我收回这句话——从现在起,我会尝试以更恰当的方式回答。我终于找到了!很简单。DataRowView drv=(DataRowView)myGrid.SelectedItem;字符串结果=(drv[“CustomerID”])。ToString();MessageBox.Show(结果);不工作。它显示了投射错误。“无法将类型为fy-匿名”对象“13”,请考虑对您的答案添加一些解释。
private void CheckBox_Checked(object sender, RoutedEventArgs e)
{
    DataGrid row = (DataGrid)myGrid.SelectedItems[1]; // <--- 2nd item, not 2nd column!
    System.Windows.MessageBox.Show(row);
}
DataGrid row = (DataGrid)myGrid.SelectedItems[1];
YourDataType row = myGrid.SelectedItems[0];
int ItemId = row.ItemID;
DataRowView drv = (DataRowView)myGrid.SelectedItem; 
String result = (drv["CustomerID"]).ToString(); 
MessageBox.Show(result);
object item = dataGrid1.SelectedItem;
           string ID = (dataGrid1.SelectedCells[0].Column.GetCellContent(item) as TextBlock).Text;
<DataGrid Name="dataGridShowStudents">
</DataGrid>

private void dataGridShowStudents_MouseDoubleClick(object sender, MouseButtonEventArgs e){
        DataRowView drv = (DataRowView)dataGridShowStudents.SelectedItem;
        string result = drv[0].ToString();
        MessageBox.Show(result);
    }
YourDataGrid.SelectedIndex = X; 
DataRowView v = (DataRowView)YourDataGrid.SelectedItem;
TextBox1.Text = v[0].ToString();
TextBox2.Text = v[1].ToString();
TextBox3.Text = v[2].ToString();