Slow datagrid .NET c#

  • Thread starter hennovanrensburg
  • Start date
H

hennovanrensburg

Hi all,

I've noted a couple of posts regarding the speed of a datagrid in a
..net win app.

My datagrid consists of 37 rows and 12 cols, and is unacceptably slow.
How can this be? Should I load 12,000 records it's understandable.

Is it just me? Or is this normal?

Are there any other components available to substitute this
sub-standard control?

Thanks!
 
L

Lars Behrmann

Hi,

of course that sounds not normal. But it don't have
to be the DataGrid which is so slow! You should
Benchmark first your Database Queries. Maybe getting
the data are take the most of the time? Additional
to that it could be helpfull if you could post a little
more information about the data size and types you
load into the grid.

Cheers
Lars Behrmann

Nothing is impossible. UML is the key for all your problems.
AODL - Make your .net apps OpenOffice ready
http://aodl.sourceforge.net/
 
H

hennovanrensburg

Hi thanks for your quick reply.

I did benchmark the DB query and that's not the problem. The dataset
does however consist of 4 tables and datarelations between them. So the
resulting datagrid, contains a fairly big dataset. At first I thought
that might be the problem, but even if i disable the datarelations, and
only load the primary table, it's still slowish.

The problem is more that the control repaints extrelemly slow. When
scroll up and down, it refreshes at a rediculous rate. The data types
are all the basics. Int, strings, datetimes. Nothing fancy.

dataGridProjects.DataSource = null;
EMRemote.Data.dsProjects dsProjects =
EMRemote.clsProjects.readActiveCompanyProjects();
EMRemote.Data.dsProjectTeams dsProjectTeams =
EMRemote.clsProjectTeams.readProjectTeams();
DataSet dsQuotes = EMRemote.clsQuotes.readQuotesForDisplay();
DataSet dsOrders = EMRemote.clsOrders.readOrdersForDisplay();


EMRemote.Data.dsTasks dsTasks = EMRemote.clsTasks.readTasks();

DataSet dsProjectsView = new DataSet();

dsProjectsView.Merge(dsProjects.Tables[0]);
dsProjectsView.Merge(dsProjectTeams.Tables[0]);
dsProjectsView.Merge(dsQuotes.Tables[0]);
dsProjectsView.Merge(dsOrders.Tables[0]);
dsProjectsView.Merge(dsTasks.Tables[0]);

dsProjects = null;
dsProjectTeams = null;
dsQuotes = null;
dsOrders = null;
dsTasks = null;
GC.Collect();



DataRelation drProjectProjectTeams = new DataRelation("Project Team
Members", dsProjectsView.Tables["tblProject"].Columns["pkiProjectID"],
dsProjectsView.Tables["tblProjectTeam"].Columns["fkiProjectID"],
false);
dsProjectsView.Relations.Add(drProjectProjectTeams);

DataRelation drProjectProjectQuotes = new DataRelation("Project
Quotes", dsProjectsView.Tables["tblProject"].Columns["sProjectCode"],
dsProjectsView.Tables["tblQuote"].Columns["Project"], false);
dsProjectsView.Relations.Add(drProjectProjectQuotes);

DataRelation drProjectProjectOrders = new DataRelation("Project
Orders", dsProjectsView.Tables["tblProject"].Columns["sProjectCode"],
dsProjectsView.Tables["tblOrder"].Columns["Project"], false);
dsProjectsView.Relations.Add(drProjectProjectOrders);

DataRelation drProjectProjectTasks = new DataRelation("Project
Tasks", dsProjectsView.Tables["tblProject"].Columns["pkiProjectID"],
dsProjectsView.Tables["tblTask"].Columns["fkiProjectID"], false);
dsProjectsView.Relations.Add(drProjectProjectTasks);


DataViewManager dvManager = new DataViewManager(dsProjectsView);
dvManager.DataViewSettings["tblProject"].RowFilter =
"fkiProjectStatusID <> 7 and fkiProjectStatusID <> 8";

try
{
dataGridProjects.SetDataBinding(dvManager, "tblProject");
//dataGridProjects.DataSource =
dsProjectsView.Tables["tblProject"];
}
finally
{
dsProjectsView = null;

}
 
H

hennovanrensburg

Hmmm.... I'm not sure that's the problem.

I wrote the dataset to xml and it's 115KB. I also created a seperate
win app just to load this dataset in a plain datagrid, but with no
improvement.

Could i post the xml dataset?

The code in the test win app is as simple as


DataSet ds = new DataSet();
ds.ReadXmlSchema("c:\\xml.xsd");
ds.ReadXml("c:\\xml.xml");
dataGrid1.DataSource = ds.Tables[0];

The XML schema is this

<?xml version="1.0" standalone="yes"?>
<xs:schema id="NewDataSet" xmlns=""
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xs:element name="NewDataSet" msdata:IsDataSet="true"
msdata:Locale="en-ZA">
<xs:complexType>
<xs:choice maxOccurs="unbounded">
<xs:element name="tblProject">
<xs:complexType>
<xs:sequence>
<xs:element name="pkiProjectID" msdata:ReadOnly="true"
msdata:AutoIncrement="true" type="xs:int" />
<xs:element name="sBusinessPartnerCode" type="xs:string"
/>
<xs:element name="dClientRate" type="xs:decimal" />
<xs:element name="fkiCompanyID" type="xs:int" />
<xs:element name="fkiDivisionID" type="xs:int" />
<xs:element name="sProjectCode" type="xs:string" />
<xs:element name="sProjectName" type="xs:string" />
<xs:element name="sProjectDescription" type="xs:string"
minOccurs="0" />
<xs:element name="fkiProjectLead" type="xs:int" />
<xs:element name="fkiProjectManager" type="xs:int" />
<xs:element name="dtPlannedStart" type="xs:dateTime" />
<xs:element name="dtPlannedFinish" type="xs:dateTime" />
<xs:element name="dtActualStart" type="xs:dateTime" />
<xs:element name="dtActualFinish" type="xs:dateTime" />
<xs:element name="dtCreatedOn" type="xs:dateTime" />
<xs:element name="fkiCreatedBy" type="xs:int" />
<xs:element name="dtRevisedOn" type="xs:dateTime" />
<xs:element name="fkiRevisedBy" type="xs:int" />
<xs:element name="fkiCalenderID" type="xs:int" />
<xs:element name="fkiProjectStatusID" type="xs:int" />
<xs:element name="fkiProjectPhaseID" type="xs:int" />
<xs:element name="dPercComplete" type="xs:decimal" />
<xs:element name="bDeleted" type="xs:boolean" />
<xs:element name="CardName" type="xs:string"
minOccurs="0" />
<xs:element name="sProjectStatus" type="xs:string"
minOccurs="0" />
<xs:element name="PlannedHours" type="xs:decimal"
minOccurs="0" />
<xs:element name="ActualHours" type="xs:decimal"
minOccurs="0" />
<xs:element name="AvgPercComplete" type="xs:decimal"
minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="tblProjectTeam">
<xs:complexType>
<xs:sequence>
<xs:element name="pkiProjectTeamID"
msdata:ReadOnly="true" msdata:AutoIncrement="true" type="xs:int" />
<xs:element name="fkiProjectID" type="xs:int" />
<xs:element name="fkiPersonID" type="xs:int" />
<xs:element name="fkiProjectRoleID" type="xs:int" />
<xs:element name="sFullName" type="xs:string"
minOccurs="0" />
<xs:element name="sRoleName" type="xs:string"
minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="tblQuote">
<xs:complexType>
<xs:sequence>
<xs:element name="DocEntry" type="xs:int" minOccurs="0"
/>
<xs:element name="DocNum" type="xs:int" minOccurs="0" />
<xs:element name="DocDate" type="xs:dateTime"
minOccurs="0" />
<xs:element name="CardCode" type="xs:string"
minOccurs="0" />
<xs:element name="fkiCompanyID" type="xs:int"
minOccurs="0" />
<xs:element name="Project" type="xs:string" minOccurs="0"
/>
<xs:element name="Total" type="xs:decimal" minOccurs="0"
/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="tblOrder">
<xs:complexType>
<xs:sequence>
<xs:element name="DocEntry" type="xs:int" minOccurs="0"
/>
<xs:element name="DocNum" type="xs:int" minOccurs="0" />
<xs:element name="DocDate" type="xs:dateTime"
minOccurs="0" />
<xs:element name="CardCode" type="xs:string"
minOccurs="0" />
<xs:element name="fkiCompanyID" type="xs:int"
minOccurs="0" />
<xs:element name="Project" type="xs:string" minOccurs="0"
/>
<xs:element name="Total" type="xs:decimal" minOccurs="0"
/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="tblTask">
<xs:complexType>
<xs:sequence>
<xs:element name="pkiTaskID" msdata:ReadOnly="true"
msdata:AutoIncrement="true" type="xs:int" />
<xs:element name="fkiCompanyID" type="xs:int" />
<xs:element name="LineNum" type="xs:int" />
<xs:element name="fkiProjectID" type="xs:int" />
<xs:element name="fkiProjectPhaseID" type="xs:int" />
<xs:element name="Description" type="xs:string" />
<xs:element name="dtPlannedStart" type="xs:dateTime" />
<xs:element name="dtPlannedFinish" type="xs:dateTime" />
<xs:element name="dPlannedHours" type="xs:decimal" />
<xs:element name="dtActualStart" type="xs:dateTime" />
<xs:element name="dtActualFinish" type="xs:dateTime" />
<xs:element name="dPercComplete" type="xs:decimal" />
<xs:element name="dActualHours" type="xs:decimal"
minOccurs="0" />
<xs:element name="sPhaseName" type="xs:string"
minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
<xs:unique name="dsProjectsKey1" msdata:primaryKey="true">
<xs:selector xpath=".//tblProject" />
<xs:field xpath="pkiProjectID" />
</xs:unique>
<xs:unique name="dsProjectTeamsKey1" msdata:primaryKey="true">
<xs:selector xpath=".//tblProjectTeam" />
<xs:field xpath="pkiProjectTeamID" />
</xs:unique>
<xs:unique name="dsTasksKey1" msdata:primaryKey="true">
<xs:selector xpath=".//tblTask" />
<xs:field xpath="pkiTaskID" />
<xs:field xpath="fkiCompanyID" />
<xs:field xpath="LineNum" />
</xs:unique>
</xs:element>
<xs:annotation>
<xs:appinfo>
<msdata:Relationship name="Project_x0020_Team_x0020_Members"
msdata:parent="tblProject" msdata:child="tblProjectTeam"
msdata:parentkey="pkiProjectID" msdata:childkey="fkiProjectID" />
<msdata:Relationship name="Project_x0020_Quotes"
msdata:parent="tblProject" msdata:child="tblQuote"
msdata:parentkey="sProjectCode" msdata:childkey="Project" />
<msdata:Relationship name="Project_x0020_Orders"
msdata:parent="tblProject" msdata:child="tblOrder"
msdata:parentkey="sProjectCode" msdata:childkey="Project" />
<msdata:Relationship name="Project_x0020_Tasks"
msdata:parent="tblProject" msdata:child="tblTask"
msdata:parentkey="pkiProjectID" msdata:childkey="fkiProjectID" />
</xs:appinfo>
</xs:annotation>
</xs:schema>
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top