Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
HomeAnnouncementsFree MagazinesWhite PapersSubmit Content
Discussion GroupsASP.NETWindows FormsLanguages.NET FrameworkVisual Studio.NET
Articles.NET FrameworkASP.NETToolsWindows Forms
.NET DirectoryOpen Source ProjectsUser GroupsWeb Resources
Related Topics
Visual Basic 6SQL ServerMS AccessOther DB ProductsMS Server ProductsMore Topics ...

.NET Forum / Windows Forms / WinForm Data Binding / July 2008

Tip: Looking for answers? Try searching our database.

Part-2: Code works in form constructor but fails to relocate elsewhere

Thread view: 
Enable EMail Alerts  Start New Thread
Thread rating: 
Mansoor A. Karim - 10 Jul 2008 06:47 GMT
Not that I am obssessed with running code in the constructor but I am unable
to make this following piece of simple code run anywhere other than the form
constructor. While this code completes (for total 91 customer records in
Customers table) in about 5 secs in the form constructor, it takes
infinitely long (more than 20 mins or sometimes runs endlessly) when
relocated in forms load event or button click event. No error is thrown, the
process just hogs the system processor and runs infinitely. The performance
difference is too great to be ascribed to any inherent constructor code
optimization.

This code creates, fills and relates NorthWindTraders tables Customers,
Orders, OrdersDetails, Products and cycles through related records for each
customer appending selected fields from each related record to a textBox1.

Please crack this problem for me.

Thanks
Mansoor

           DataSet dataSet;
           DataRelation relation;

           SqlConnection objConnection;
           SqlDataAdapter objDataAdapter;

           //Create and open connection
           objConnection = new SqlConnection(ConnectionString);
           objConnection.Open();

           //Create dataset
           dataSet = new DataSet("NorthWindDatabase");

           //Create and fill Customers, Orders, OrdersDetails and Products
table
           objDataAdapter = new SqlDataAdapter("SELECT * FROM Customers",
objConnection);
           objDataAdapter.Fill(dataSet, "Customers");

           objDataAdapter = new SqlDataAdapter("SELECT * FROM Orders",
objConnection);
           objDataAdapter.Fill(dataSet, "Orders");

           objDataAdapter = new SqlDataAdapter("SELECT * FROM [Order
Details]", objConnection);
           objDataAdapter.Fill(dataSet, "Order_Details");

           objDataAdapter = new SqlDataAdapter("SELECT * FROM Products",
objConnection);
           objDataAdapter.Fill(dataSet, "Products");

           //Close connection
           objConnection.Close();

           //Create constraints and relations between tables
           relation = new DataRelation("CustomerOrders",
                                           dataSet.Tables["Customers"].Columns["CustomerID"],
                                           dataSet.Tables["Orders"].Columns["CustomerID"]);
           dataSet.Relations.Add(relation);

           relation = new DataRelation("OrderDetails",
                                           dataSet.Tables["Orders"].Columns["OrderID"],
                                           dataSet.Tables["Order_Details"].Columns["OrderID"]);
           dataSet.Relations.Add(relation);

           relation = new DataRelation("ProductDetails",
                                           dataSet.Tables["Products"].Columns["ProductID"],
                                           dataSet.Tables["Order_Details"].Columns["ProductID"]);
           dataSet.Relations.Add(relation);

           //Proceed to display records in the text box
           textBox1.Text = string.Empty;
           int CustomerCount = 0;

           foreach (DataRow customerRow in
dataSet.Tables["Customers"].Rows)
           {
               textBox1.Text += ++CustomerCount + ") Customer: " +
(string)customerRow["CompanyName"] + Environment.NewLine;

               foreach (DataRow orderRow in
customerRow.GetChildRows("CustomerOrders"))
               {
                   textBox1.Text += "\tOrderDate: " +
(DateTime)orderRow["OrderDate"] + Environment.NewLine;

                   foreach (DataRow detailRow in
orderRow.GetChildRows("OrderDetails"))
                   {
                       textBox1.Text += "\t\tProduct: " +
(string)detailRow.GetParentRow("ProductDetails")["ProductName"] +
Environment.NewLine;
                       textBox1.Text += "\t\tQuantity: " +
(short)detailRow["Quantity"] + Environment.NewLine;
                   }
               }

               //Add blank line after every customer record
               textBox1.Text += Environment.NewLine;
           }
       }
Morten Wennevik [C# MVP] - 10 Jul 2008 08:23 GMT
Hi Mansoor,

When you set the Text property of a TextBox, a whole lot of stuff happens,
and probably more than a thousand lines of code is running.  When you run
this in the constructor much of the code isn't running simply because the
TextBox isn't fully created at that time.

Furthermore, when doing heavy looping and string manipulation you should use
a StringBuilder.  Change all textBox.Text += ... + Environment.NewLine to
something like

StringBuilder sb = new StringBuilder()

foreach()
{
    sb.AppendLine(...);
}

textBox1.Text = sb.ToString();

This would cause the heavy TextBox.Text code to run only once.
Signature

Happy Coding!
Morten Wennevik [C# MVP]

> Not that I am obssessed with running code in the constructor but I am unable
> to make this following piece of simple code run anywhere other than the form
[quoted text clipped - 96 lines]
>             }
>         }
Mansoor A. Karim - 11 Jul 2008 08:23 GMT
Thanks again Morten.

I now realize the very obvious inefficiency in my logic. Having ported all
string manipulations to StringBuilder and consequent one time textBox1.Text
(again a String data type) property assignment, performance is now
consistent throughout for all code relocations. I had repeatedly come across
cautions in the msdn against inefficiency of repetitive String assignments
but then reading is no substitute to practical experience.

I am just upgrading from VB6 to C#/.Net and am grappling with both grammar
and symantics, the latter being more challenging for me.

> Hi Mansoor,
>
[quoted text clipped - 133 lines]
>>             }
>>         }

Free Magazines

Get these publications absolutely FREE for up to 12 months. There are no hidden fees and no obligation. Simply choose a title, complete the application form and submit it. Read more ...

Oracle MagazineNetwork ComputingComputer WorldBio-IT WorldeWeekInformation WeekInfosecurity
 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2008 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.