C# 从DataGrid切换到telerik RadGridView,现在使用WPF解决性能问题
我刚从DataGrid切换到telerik RadGridView,现在加载数据所需的时间与我使用DataGrid时加载的时间相比有很大的滞后。有人可以看一看,让我知道我做错了我是新的WPF 下面是我的xaml:C# 从DataGrid切换到telerik RadGridView,现在使用WPF解决性能问题,c#,wpf,telerik,wpfdatagrid,telerik-grid,C#,Wpf,Telerik,Wpfdatagrid,Telerik Grid,我刚从DataGrid切换到telerik RadGridView,现在加载数据所需的时间与我使用DataGrid时加载的时间相比有很大的滞后。有人可以看一看,让我知道我做错了我是新的WPF 下面是我的xaml: <DockPanel Name="dpHistory" LastChildFill="True" sl:UIAudit.Drsapplication="EMR" sl:UIAudit.Drsarea="SuperBillHistory"> <teler
<DockPanel Name="dpHistory" LastChildFill="True" sl:UIAudit.Drsapplication="EMR" sl:UIAudit.Drsarea="SuperBillHistory">
<telerik:RadGridView Name="dgData" telerik:StyleManager.Theme="Summer" CanUserDeleteRows="False" IsReadOnly="True" AutoGenerateColumns="False" Grid.ColumnSpan="2" RowHeight="25"
ShowGroupPanel="False"
IsFilteringAllowed="False"
CanUserReorderColumns="False"
RowIndicatorVisibility ="Collapsed"
EnableRowVirtualization="True"
EnableColumnVirtualization="True"
FrozenColumnCount="2"
SelectionUnit="FullRow"
SelectionMode="Extended"
AlternationCount="2"
AlternateRowBackground="LightSteelBlue">
</telerik:RadGridView>
</DockPanel>
==================================================================================
这是我构建网格的代码
public void LoadHistory(Patient patient, ApptData appointment, DaysOfHistory_Enum daysOfHistory = DaysOfHistory_Enum.SixMonths)
{
if (patient.PatientId != intPatientId || reload || currentNextAppt || isNextAppt)
{
intDaysOfHistory = (-1) * ((int)daysOfHistory);
currentNextAppt = isNextAppt;
activePatient = patient;
activeAppt = appointment;
intPatientId = activePatient.PatientId;
intApptId = appointment.ApptId;
reload = false;
if (isNextAppt)
{
LoadNextApptHistory();
return;
}
DataSet ds = null;
if (isTreatment)
{
ds = DrScribe.SharedLib.Application.WebService.ExecuteQuery("emr_selectTreatmentHistory", new SPParam[] {
new SPParam("@PatientId", intPatientId),
new SPParam("@StartDate", activeAppt.ApptDate.AddDays(intDaysOfHistory)) });
}
else
{
ds = DrScribe.SharedLib.Application.WebService.ExecuteQuery("emr_selectSuperBillHistory2", new SPParam[] {
new SPParam("@PatientId", intPatientId),
new SPParam("@StartDate", activeAppt.ApptDate.AddDays(intDaysOfHistory)) });
}
DataTable table = ds.Tables[0];
DataTable dataTable = new DataTable("tableData");
Dictionary<string, DateTime> dates = new Dictionary<string, DateTime>();
Dictionary<string, int> rownum = new Dictionary<string, int>();
dateView = new DataView(table);
dateView.Sort = "ApptDate desc";
foreach (DataRowView dr in dateView)
{
String date = formatDate(dr["ApptDate"].ToString(), "_");
if (!dates.ContainsKey(date))
{
dates.Add(date, DateTime.Parse(dr["ApptDate"].ToString()));
}
}
dataTable.Columns.Add(new DataColumn("Code", Type.GetType("System.String")));
dataTable.Columns.Add(new DataColumn("Description", Type.GetType("System.String")));
foreach (string date in dates.Keys)
{
dataTable.Columns.Add(new DataColumn("ApptDate" + date, Type.GetType("System.String")));
}
foreach (DataRow dr in table.Rows)
{
string key = dr["Code"] + "_" + dr["Description"];
if (!rownum.ContainsKey(key))
{
DataRow row = dataTable.NewRow();
rownum.Add(key, rownum.Count);
dataTable.Rows.Add(row);
row["Code"] = dr["Code"];
row["Description"] = dr["Description"];
}
}
foreach (DataRow dr in table.Rows)
{
string key = dr["Code"] + "_" + dr["Description"];
int row = (int)rownum[key];
string date = formatDate(dr["ApptDate"].ToString(), "_");
string result = string.Empty;
if (dr["Dosage"].ToString() != string.Empty)
result = dr["Dosage"].ToString();
else if (dr["Units"].ToString() != string.Empty)
result = dr["Units"].ToString();
dataTable.Rows[row]["ApptDate" + date] = result;
}
dataTable.AcceptChanges();
dgData.Columns.Clear();
dgData.Columns.Add(new Telerik.Windows.Controls.GridViewDataColumn() { DataMemberBinding = new Binding("Code"), Header = "Code", Width = new GridViewLength(75) });
dgData.Columns.Add(new Telerik.Windows.Controls.GridViewDataColumn() { DataMemberBinding = new Binding("Description"), Header = "Description", Width = new GridViewLength(250) });
foreach (string date in dates.Keys)
{
Binding b = new Binding("ApptDate" + date);
CheckmarkConverter c = new CheckmarkConverter();
b.Converter = c;
GridViewDataColumn t = new GridViewDataColumn();
t.DataMemberBinding = b;
t.Header = date.Replace("_", "/");
t.Width = new GridViewLength(70);
dgData.Columns.Add(t); //new DataGridTextColumn() { Binding = new Binding("ApptDate" + date), Header = date.Replace("_", "/"), Width = new DataGridLength(70) });
}
dgData.ItemsSource = new DataView(dataTable);
}
}
public void LoadHistory(患者-患者,ApptData预约,DaysOfHistory\u Enum DaysOfHistory=DaysOfHistory\u Enum.六个月)
{
如果(patient.PatientId!=intPatientId | | | | | | | current nextapt | | isnextapt)
{
intDaysOfHistory=(-1)*((int)daysOfHistory);
CurrentNextapt=IsNextapt;
病人=病人;
activeAppt=预约;
intPatientId=activePatient.PatientId;
intApptId=appointment.ApptId;
重新加载=错误;
如果(isnextapt)
{
加载nextapthistory();
返回;
}
数据集ds=null;
如果(isTreatment)
{
ds=DrScribe.SharedLib.Application.WebService.ExecuteQuery(“emr\u selectTreatmentHistory”,新SPParam[]{
新SPParam(“@PatientId”,intPatientId),
新的SPParam(“@StartDate”,activeAppt.ApptDate.AddDays(intDaysOfHistory))});
}
其他的
{
ds=DrScribe.SharedLib.Application.WebService.ExecuteQuery(“emr_selectSuperBillHistory2”,新SPParam[]{
新SPParam(“@PatientId”,intPatientId),
新的SPParam(“@StartDate”,activeAppt.ApptDate.AddDays(intDaysOfHistory))});
}
DataTable=ds.Tables[0];
DataTable DataTable=新的DataTable(“tableData”);
字典日期=新字典();
Dictionary rownum=新字典();
dateView=新数据视图(表);
dateView.Sort=“ApptDate desc”;
foreach(dateView中的DataRowView dr)
{
字符串日期=格式化日期(dr[“ApptDate”].ToString(),“”);
如果(!dates.ContainsKey(日期))
{
Add(date,DateTime.Parse(dr[“ApptDate”].ToString());
}
}
dataTable.Columns.Add(新的DataColumn(“Code”,Type.GetType(“System.String”));
dataTable.Columns.Add(新的DataColumn(“Description”,Type.GetType(“System.String”));
foreach(dates.Keys中的字符串日期)
{
dataTable.Columns.Add(新的DataColumn(“ApptDate”+日期,Type.GetType(“System.String”));
}
foreach(table.Rows中的数据行dr)
{
字符串键=dr[“代码”]+“”+dr[“说明”];
如果(!rownum.ContainsKey(键))
{
DataRow行=dataTable.NewRow();
添加(键,rownum.Count);
dataTable.Rows.Add(行);
行[“代码”]=dr[“代码”];
行[“说明”]=dr[“说明”];
}
}
foreach(table.Rows中的数据行dr)
{
字符串键=dr[“代码”]+“”+dr[“说明”];
int row=(int)rownum[key];
字符串日期=格式化日期(dr[“ApptDate”].ToString(),“”);
字符串结果=string.Empty;
如果(dr[“剂量”].ToString()!=string.Empty)
结果=dr[“剂量”]。ToString();
else if(dr[“Units”].ToString()!=string.Empty)
结果=dr[“单位]。ToString();
dataTable.Rows[row][“ApptDate”+日期]=结果;
}
dataTable.AcceptChanges();
dgData.Columns.Clear();
dgData.Columns.Add(new Telerik.Windows.Controls.GridViewDataColumn(){DataMemberBinding=new Binding(“Code”),Header=“Code”,Width=new GridViewLength(75)});
dgData.Columns.Add(new Telerik.Windows.Controls.GridViewDataColumn(){DataMemberBinding=new Binding(“Description”),Header=“Description”,Width=new GridViewLength(250)});
foreach(dates.Keys中的字符串日期)
{
绑定b=新绑定(“ApptDate”+日期);
CheckmarkConverter c=新的CheckmarkConverter();
b、 转换器=c;
GridViewDataColumn t=新的GridViewDataColumn();
t、 DataMemberBinding=b;
t、 页眉=日期。替换(““,“/”);
t、 宽度=新的GridViewLength(70);
dgData.Columns.Add(t);//new-DataGridTextColumn(){Binding=new-Binding(“ApptDate”+date),Header=date.Replace(“/”),Width=new-DataGridLength(70)});
}
dgData.ItemsSource=新数据视图(数据表);
}
}
查看他们的网站文档,了解提高性能的方法。我会链接,但目前在手机上。RadGridView性能故障排除有一个专用项
我知道有两点是避免交替计数、无限高和无限宽,以及RadGridView的放置控制
您还可以查看Telerik的“VirtualQueryableDataSource”(我想它的名字是)。它支持UI虚拟化
编辑:(来自Telerik支持票证)
然后,如果将GridView放置在TabControl或
RadPaneGroup,请设置
包含控件为True。这样就不会重新加载GridView
每次在视图之间切换时。”
为什么要从DataGrid转换?公司想使用telerik