0

我正在尝试从 DataGrid 的 wpf 中的选定项目中获取行的特定列。

数据网格的名称是Datagrid_Newsale

当它被选中时,我会收到整行的警报,所以我尝试映射它的列。

说如果行是-

{ ID = 3, CustomerName = xyz, SaleDate = 05.08.2013 00:00:00, TotalAmount = 10 }

然后它的列CustomerName=xyz将显示在文本框中。

获得行-

var copyitem = Datagrid_NewSale.SelectedItem;

if (copyitem == null)
{
    MessageBox.Show("Please select values from list");
}
if (copyitem != null)
{                       
    MessageBox.Show(copyitem.ToString());
}

为了让 customerName 进入文本框,我尝试创建一个新的模型实例-

public class CustomerDetailes
{
    public string CustomerName { get; set; }
}

以及来自客户表的数据库中的值-

public void viewcustomername()
{
    List<CustomerDetailes> ilist = null;
    ilist = (from order in db.Customer
                select new CustomerDetailes
                {
                    CustomerName= order.CustomerName
                }).ToList();
    txtCustumer.Text = ilist.ToString();

}

所以再试一次——

CustomerDetailes copyitem = (CustomerDetailes)Datagrid_NewSale.SelectedItem;

if (copyitem == null)
{
    MessageBox.Show("Please select values from list");
}
if (copyitem != null)
{                       
    MessageBox.Show(copyitem.ToString());
}

txtCustomer.text=copyitem.CustomerName;  //CustomerName into a textbox

但它在 copyitem 中引用 null。

如何从整行中获取特定列。

4

4 回答 4

0

我想出了这个简单的解决方案。

在我的情况下,映射的数据类型copyitem是匿名的。在这种情况下,使用Dynamic数据类型解决了我的问题。

由于我的数据是动态的,然后我试图映射出特定的列,所以实际上不可能静态地进行,因为那时没有数据。

使用动态数据类型-

 dynamic copyitem = dataGrid1.SelectedItem;

访问属性-

int localId = copyitem.ID;

此外,对于 customerName,TotalAmount 我也做了同样的事情。

Linq 查询更改-

var query= (from order in db.Customer
where order.ID=localId
select order).ToList();

DataGrid_OpenSale.ItemsSource=query// 将数据返回到另一个数据网格。

于 2013-08-30T04:36:55.687 回答
0

您必须将ItemsSourceDataGrid 绑定到 CustomerDetails 集合才能在 SelectedItem 中获取 CustomDetails。

在您的视图模型(如果使用 MVVM)或后面的代码中创建属性

List<CustomerDetails> customerDetails = new List<CustomerDetails>();
    List<CustomerDetails> MyCollection
    {
        get
        {

            return myList;
        }
        set
        {
            myList = value;
            PropertyChanged(this, new PropertyChangedEventArgs("MyCollection"));
        }
    }

在 xaml 中就可以了。

<DataGrid ItemsSource="{Binding MyCollection}"/>

或者,如果您直接在数据网格中填充项目,请添加 CustomerDetails 的实例,例如

dataGrid.Items.Add(new CustomerDetails(){Name = "abc"}, xyz propertis)

谢谢

于 2013-08-29T13:33:44.597 回答
0

如果您可以从选择事件中访问网格,那么以下应该为您提供列 ((DataGrid)sender).CurrentCell.Column.Header

并为列名使用一些映射到您要显示的对象的属性

于 2013-08-29T15:27:47.467 回答
0

在VB中⠀⠀⠀

Private Sub SCUSTDataGrid_GotFocus(sender As Object, e As RoutedEventArgs) Handles SCUSTDataGrid.GotFocus
  Dim og As DataGridCell = e.OriginalSource
  Dim ccontent As TextBlock = og.Content
  Dim dg As DataGrid
  dg = e.Source
  Dim selcol As String = dg.CurrentCell.Column.Header.ToString

  MessageBox.Show(selcol.ToString + ccontent.Text + " got focus event")
End Sub
于 2018-11-18T14:55:31.493 回答