Невозможно редактировать ячейки в RadGridView Telerik WPF

В настоящее время я использую 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;
    }
}

Если кто-то может помочь мне с этим, это было бы очень признательно. Честно говоря, я очень смущен тем, что не так с моим кодом.

EDIT: я обновил код для события 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();
}

EDIT: теперь я добавил свойства DeductId, CheckNo и CheckDate в запрос linq.

EDIT: Вот класс 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; }
}

person GamerTalks    schedule 14.08.2017    source источник
comment
Показанный вами код работает нормально, учитывая, что модели, которые вы пытаетесь связать, на самом деле имеют свойства, называемые DeductId, CheckNo и CheckDate. Не могли бы вы показать часть кода, которая привязывает ваш источник данных к сетке? Другими словами, как вы привязываете или назначаете ItemsSource сетки данных? Вы случайно не привязываете запрос непосредственно к сетке данных?   -  person Vincent    schedule 15.08.2017
comment
Да, я привязываю linq-запрос к ItemsSource непосредственно к сетке. Запрос объединяет три разные таблицы из используемой мной базы данных и отображает необходимую информацию. Я отредактирую этот пост завтра, когда у меня будет доступ к приложению, и опубликую код, связывающий ItemsSource. Но для других свойств, таких как DeductID, CheckNo и CheckDate, я запрограммировал эти свойства отдельно, поскольку они не являются частью базы данных и также будут публиковать их.   -  person GamerTalks    schedule 15.08.2017
comment
Хорошо, я отредактировал свой пост, чтобы показать запрос linq, который является ItemsSource, а также опубликовал свой код, в котором я установил свойства для DeductId, CheckNo и CheckDate.   -  person GamerTalks    schedule 15.08.2017


Ответы (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);
}

Вам также необходимо убедиться, что тип T из IEnumerable<T>, который вы установили как ItemsSource для RadGridView, действительно содержит свойства DeductId, CheckNo и CheckDate и что у каждого из них есть общедоступный установщик.

Привязка к коллекции объектов анонимного типа работать не будет. Вам нужно создать класс, который содержит все свойства (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);
person mm8    schedule 15.08.2017
comment
Спасибо за ответ. Я обновил свой пост, чтобы точно показать, что я устанавливаю в качестве своего ItemsSource. Я использую запрос linq, потому что большая часть информации, которую я показываю, взята из базы данных. Должен ли я также включать три настраиваемых столбца в мой запрос linq? - person GamerTalks; 15.08.2017
comment
Вам следует создать новый класс, включающий все свойства, т. е. Customer_Name, Customer_Id, Job_Id, Claim_Id, DeductId, CheckNo и CheckDate, а затем выполнить select new YourClass в Window_Loaded. - person mm8; 15.08.2017
comment
Я должен упомянуть, что я работаю с тремя разными таблицами данных, поэтому у каждой из них есть свой класс со свойствами. Я извлекаю их из каждого из разных классов в моем запросе linq, а затем у меня есть отдельные свойства для DeductId, CheckNo и CheckDate, которые пользователь должен вводить в информации. Мне только что удалось поместить их в запрос linq, однако теперь я вообще не могу редактировать ячейки. Я не могу щелкнуть и ввести в ячейки, созданные из запроса linq. - person GamerTalks; 15.08.2017
comment
Пожалуйста, отредактируйте свой вопрос и включите текущую реализацию метода Window_Loaded и ваш новый класс. - person mm8; 15.08.2017
comment
Я отредактировал вопрос с помощью моего нового запроса linq. Свойства, которые я установил для DeductId, CheckNo и CheckDate, находятся в нижней части вопроса, и у меня нет для них отдельного класса, потому что на данный момент он мне не нужен для решения этой проблемы. - person GamerTalks; 15.08.2017
comment
Как уже упоминалось, вам нужно создать класс, который содержит все свойства. Теперь вы привязываетесь к анонимному типу, у которого нет сеттеров. Вот почему вы не можете редактировать ячейки. Это не сработает: select new. Это будет select new YourClass. Так что да, вы должны создать класс. - person mm8; 15.08.2017
comment
К сожалению, это все еще не работает. Столбцы отображаются, но они по-прежнему установлены как ReadOnly, и я не могу их редактировать. У меня есть свойство ReadOnly RadGridView, установленное в false, поэтому я не уверен, почему эта проблема сохраняется. - person GamerTalks; 15.08.2017
comment
Разместите свой класс. - person mm8; 15.08.2017
comment
Выше мой класс. хотя проблема все еще будет заключаться в получении данных из фактической базы данных, поскольку они находятся в отдельном объекте. - person GamerTalks; 15.08.2017
comment
Вы делаете select new DataProperties? - person mm8; 15.08.2017
comment
на самом деле, я только что понял, что некоторые из них были запрограммированы неправильно, увидев ваш отредактированный ответ. Я собираюсь попробовать что-то еще очень быстро. - person GamerTalks; 15.08.2017
comment
Вау, я чувствую себя идиотом. Я неправильно понял, о чем вы говорили, и пропустил тот факт, что вы обновили свой ответ. Первоначально я поместил DataProperties в скобки после select new, что и вызвало проблемы. Спасибо, вы просто спаситель :) - person GamerTalks; 15.08.2017