【问题标题】:Cannot Edit Cells in RadGridView Telerik WPF无法在 RadGridView Telerik WPF 中编辑单元格
【发布时间】:2017-08-14 16:47:42
【问题描述】:

我目前正在使用 Telerik 的 RadGridView 来显示来自数据库的数据。我想要的数据确实会加载到 gridview 中,并且我还添加了三个额外的列,供用户输入其他信息。

我遇到的问题是,当您在其中一个空单元格中输入信息并单击行/列之外时,我输入的信息就会消失。我已经搜索了与此相关的每个论坛,我认为我使用gridView.Items.CommitEdit 的代码是正确的,但是我输入到空单元格中的信息仍然消失了。这是创建额外列的代码:

private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        //Loads queries from each of the designated data tables in BSI_Test
        var customerQuery =
            (from customer in testEntity.Customers
             join job in testEntity.Jobs
             on customer.CID equals job.CID
             join claim in testEntity.Claims
             on job.JID equals claim.JID
             select new
             {
                 Customer_Name = customer.CName,
                 Customer_Id = customer.CID,
                 Job_Id = job.JID,
                 Claim_Id = claim.CLAIMID,
                 DID = DeductId,
                 Check_No = CheckNo,
                 Check_Date = CheckDate
             })
            .OrderBy(c => c.Customer_Name);


        //Populates the Telerik data grid with data.
        gridView.ItemsSource = customerQuery.ToList();


        GridViewDataColumn deductId = new GridViewDataColumn();
        deductId.UniqueName = "DeductId";
        deductId.Header = "DID";
        deductId.DataMemberBinding = new Binding("DeductId");
        gridView.Columns.Add(deductId);

        GridViewDataColumn checkNo = new GridViewDataColumn();
        checkNo.UniqueName = "CheckNo";
        checkNo.Header = "Check No";
        checkNo.DataMemberBinding = new Binding("CheckNo");
        gridView.Columns.Add(checkNo);

        GridViewDataColumn checkDate = new GridViewDataColumn();
        checkDate.UniqueName = "CheckDate";
        checkDate.Header = "Check Date";
        checkDate.DataMemberBinding = new Binding("CheckDate");
        gridView.Columns.Add(checkDate);
    }

这是我的gridView_CellEditEnded 事件,它尝试提交对列所做的任何编辑。注意:我确实使用断点测试了这个事件,当我在单元格中输入信息并单击它时,它确实会一直通过 if 语句。但是我输入的数据还是消失了,所以CommitEdit好像不能正常工作。

bool handle = true;
private void gridView_CellEditEnded(object sender, GridViewCellEditEndedEventArgs e)
{
    if (e.EditAction == GridViewEditAction.Commit && handle)
    {
        handle = false;
        gridView.Items.EditItem(this.gridView.CurrentItem);
        gridView.Items.CommitEdit();
        handle = true;
    }
}

如果有人能够帮助我解决这个问题,将不胜感激。老实说,我对我的代码有什么问题感到非常困惑。

编辑: 我已经更新了Window_Loaded 事件的代码,以显示将信息从数据库查询到数据网格的 linq 查询。然后将ItemsSource 作为列表设置为此查询。下面是我的 MainWindow() 方法之前的所有内容,我在其中设置了 DeductId、CheckNo 和 CheckDate 的属性。

public string DeductId { get; set; }
public int CheckNo { get; set; }
public string CheckDate { get; set; }

public MainWindow()
{
    InitializeComponent();
}

编辑: 现在我在 linq 查询中添加了 DeductId、CheckNo 和 CheckDate 属性。

编辑: 这是 DataProperties 类:

public partial class DataProperties
{
    public string CName { get; set; }
    public int CID { get; set; }
    public int JID { get; set; }
    public int CLAIMID { get; set; }
    public string DeductId { get; set; }
    public string CheckNo { get; set; }
    public string CheckDate { get; set; }
}

【问题讨论】:

  • 鉴于您尝试绑定的模型实际上具有名为“DeductId”、“CheckNo”和“CheckDate”的属性,到目前为止您显示的代码工作正常。您能否展示将数据源绑定到网格的代码部分?换句话说,如何绑定或分配数据网格的ItemsSource?您是否碰巧将查询直接绑定到数据网格?
  • 是的,我将 linq 查询绑定到 ItemsSource 直接到网格。该查询连接了我正在使用的数据库中的三个不同的表,并显示了所需的信息。一旦我可以访问应用程序并发布绑定ItemsSource 的代码,我明天将编辑这篇文章。但是对于“DeductID”、“CheckNo”和“CheckDate”等其他属性,我将这些属性单独编程,因为它们不是数据库的一部分,也会发布这些属性。
  • 好的,我已经编辑了我的帖子以显示作为 ItemsSource 的 linq 查询,并发布了我的代码,我在其中设置了 DeductId、CheckNo 和 CheckDate 的属性。

标签: c# wpf gridview telerik radgridview


【解决方案1】:

您应该将每列的DataMemberBinding 属性设置为Binding 对象:

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    GridViewDataColumn deductId = new GridViewDataColumn();
    deductId.UniqueName = "DeductId";
    deductId.Header = "DID";
    deductId.DataMemberBinding = new System.Windows.Data.Binding("DeductId");
    gridView.Columns.Add(deductId);

    GridViewDataColumn checkNo = new GridViewDataColumn();
    checkNo.UniqueName = "CheckNo";
    checkNo.Header = "Check No";
    deductId.DataMemberBinding = new System.Windows.Data.Binding("CheckNo");
    gridView.Columns.Add(checkNo);

    GridViewDataColumn checkDate = new GridViewDataColumn();
    checkDate.UniqueName = "CheckDate";
    checkDate.Header = "Check Date";
    deductId.DataMemberBinding = new System.Windows.Data.Binding("CheckDate");
    gridView.Columns.Add(checkDate);
}

您还需要确保您为RadGridView 设置为ItemsSourceIEnumerable<T> 的类型T 实际上包含DeductIdCheckNoCheckDate 属性和每个都有一个公共设置器。

绑定到匿名类型的对象集合将不起作用。您需要创建一个包含所有属性(Customer_Name、Customer_Id、Job_Id、Claim_Id、DeductId、CheckNo 和 CheckDate)的类,并为您希望能够在 RadGridView 中编辑的那些设置公共设置器:

var customerQuery =
           (from customer in testEntity.Customers
            join job in testEntity.Jobs
            on customer.CID equals job.CID
            join claim in testEntity.Claims
            on job.JID equals claim.JID
            select new YourClass //<--
            {
                Customer_Name = customer.CName,
                Customer_Id = customer.CID,
                Job_Id = job.JID,
                Claim_Id = claim.CLAIMID,
                DID = DeductId,
                Check_No = CheckNo,
                Check_Date = CheckDate
            })
           .OrderBy(c => c.Customer_Name);

【讨论】:

  • 感谢您的回复。我已经更新了我的帖子,以准确显示我设置为 ItemsSource 的内容。我正在使用 linq 查询,因为我显示的大部分信息都来自数据库。我是否还必须在我的 linq 查询中包含三个自定义列?
  • 您应该创建一个包含所有属性的新类,即 Customer_Name、Customer_Id、Job_Id、Claim_Id、DeductId、CheckNo 和 CheckDate,然后在 Window_Loaded 中执行select new YourClass
  • 我应该提到我正在使用三个不同的数据表,所以它们每个都有自己的类和属性。我从我的 linq 查询中的每个不同类中提取它们,然后我有 DeductId、CheckNo 和 CheckDate 的单独属性,供用户输入信息。我只是设法将它们放入 linq 查询中,但是现在我根本无法编辑单元格。我无法单击并输入从 linq 查询生成的单元格。
  • 请编辑您的问题并包括您当前对 Window_Loaded 方法的实现和您的新类。
  • 我已经用我的新 linq 查询编辑了这个问题。我为 DeductId、CheckNo 和 CheckDate 设置的属性位于问题的底部,我没有为它们设置单独的类,因为目前我不需要一个类来解决这个问题。
猜你喜欢
  • 1970-01-01
  • 2016-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多