C# 从DataGrid切换到telerik RadGridView,现在使用WPF解决性能问题

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

我刚从DataGrid切换到telerik RadGridView,现在加载数据所需的时间与我使用DataGrid时加载的时间相比有很大的滞后。有人可以看一看,让我知道我做错了我是新的WPF

下面是我的xaml:

<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