WPF:从所选行获取列名称

时间:2013-08-29 13:12:53

标签: c# sql wpf linq datagrid

我正试图从DataGrid的wpf中的选定项目中获取Row的特定列。

DataGrid的名称为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 个答案:

答案 0 :(得分:0)

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

在viewmodel中创建属性(如果使用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}"/>

如果您直接填写datagrid中的Items,请添加CustomerDetails的实例,如

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

由于

答案 1 :(得分:0)

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

并使用列名称的映射到要显示的对象的属性

答案 2 :(得分: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 //将数据返回到另一个数据网格。

答案 3 :(得分: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