【问题标题】:WPF: Get column name from selected rowWPF:从选定的行中获取列名
【发布时间】:2013-09-01 22:48:55
【问题描述】:

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

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。

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

【问题讨论】:

  • @nit,是的,得到整行,正如它所描述的那样。
  • @nit,No..,第一次尝试不使用模型CustomerDetails;它显示整行。但是当我使用模型时,它就会为空。
  • 对不起,我不明白。您是否将 DataGrid 的 itemsSource 设置为 CustomerDetails 集合?
  • @nit,不,我不知道,也许你想对此发表答案。

标签: c# sql wpf linq datagrid


【解决方案1】:

您必须将 DataGrid 的 ItemsSource 绑定到 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)

谢谢

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      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 // 将数据返回到另一个数据网格。

      【讨论】:

        【解决方案4】:

        在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
        

        【讨论】:

          猜你喜欢
          • 2016-10-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多