Невозможно редактировать ячейки в RadGridView Telerik WPF
Я в настоящее время использую Telerik's RadGridView
для отображения данных из базы данных. Данные, которые мне нужны, загружаются в сетку, и я также добавил три дополнительных столбца, которые пользователи могут вводить в дополнительную информацию.
У меня проблема в том, что когда вы вводите информацию в одну из пустых ячеек и щелкаете из строки / столбца, информация, которую я ввел, исчезает. Я просмотрел все форумы, связанные с этим, и я думаю, что у меня есть правильный код, использующий 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; }
}
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);