|
Hi,
I have created a C# class which, when i instantiate an object, unexpectedly runs all the protected methods I have created. This is odd as the methods are only called from within specific property gets, and when I step through the code at runtime it does not step through the methods. It is all the more frustrating as i have a counter within one of the methods, and this unexpected method call completely messes up my end results.
Does anyone have any idea what could cause this? I fear that I'm doing a really stupid thing, but I showed my code to the other developer in my office (albeit a VB developer) and he couldn't see anything wrong with the code.
Any help is appreciated, code can be provided if necessary.
Thanks,
Stuart
|
|
|
|
|
stuebbie wrote: I showed my code to the other developer in my office (albeit a VB developer) and he couldn't see anything wrong with the code.
Now that is funny!
1) so you have a class foo and when you new an instance of foo all the protected methods of the object are executed?
2) Furthermore if you put a break point in one of those methods it will not break there?
3) But you are sure it is executing, how?
led mike
|
|
|
|
|
Hi,
Thanks for the quick reply I didn't expect my colleague to come up with any answers, but it was worth a try!
1) so you have a class foo and when you new an instance of foo all the protected methods of the object are executed?
This is correct. Further to this (apologies for not mentioning), every time that I provide data to the instantiated object, via its exposed property gets, the protected methods are run again, and the private int counter is incremented again.
2) Furthermore if you put a break point in one of those methods it will not break there?
This is correct. The only time that the break point's for the protected methods are executed is when I call them from public property gets.
3) But you are sure it is executing, how?
Using Visual Studio 2005, I have set up a watch on the private int that i set up within the class for counting purposes. I set it up in the following way:
private int m_foo = 0;
When I instantiate the class foo, m_foo is set to 1. When I set foo.SomeProperty = "bar", m_foo is then set to 2. And so on, when I assign values to properties, the m_foo variable is incremented. I also set up some Debug.WriteLine commands within the protected methods, and I can view the output from these Debug objects in the output window.
It's ever so frustrating as it is probably something very small that I have missed out.
Thanks again,
Stuart
|
|
|
|
|
See the replies below about having things in the watch window. Get log4net and use that to monitor runtime behavior and see what happens.
Also as Guffa points out there seems to be a design problem in regards to how you are implementing properties which might also somehow be effecting your project. In relation to that you might want to read this[^].
Last modified: 26mins after originally posted --
led mike
|
|
|
|
|
Maybe you could share the code with us also. Might be helpful to see any problems.
only two letters away from being an asset
|
|
|
|
|
Mark Nischalke wrote: Maybe you could share the code with us
Oh dear
led mike
|
|
|
|
|
He shared it the VB in the office afterall. Might as well have qualified people look at it.
I was hoping it was a small snippet, not the usual CodeProject source code repository posting.
only two letters away from being an asset
|
|
|
|
|
I'll cut it down to a respectable size and post it shortly
|
|
|
|
|
Hi,
Code snippet is below. I've tried to include only sections that are of interest. When I instantiate this class, the addParameter method is run without invoking the public property AddParameter:
<br />
public class foo<br />
{<br />
<br />
private string[,] m_strParams = new string[c_RowArrayMaxValue,c_ColArrayMaxValue];<br />
private int m_ParamCount = 0;<br />
<br />
<br />
public Boolean AddParameter<br />
{<br />
get<br />
{<br />
return addParameter(m_ParamName, m_ParamValue, m_ParamDataType, ref m_ParamCount);<br />
}<br />
}<br />
<br />
<br />
protected Boolean addParameter(string strParamName, string strParamValue, string strParamDataType, ref int intParamCount)<br />
{<br />
<br />
try<br />
{<br />
<br />
m_strParams[Convert.ToInt32(intParamCount), 0] = strParamName;<br />
m_strParams[Convert.ToInt32(intParamCount), 1] = strParamValue;<br />
m_strParams[Convert.ToInt32(intParamCount), 2] = strParamDataType;<br />
<br />
intParamCount += 1;<br />
<br />
return true;<br />
}<br />
catch (Exception e)<br />
{<br />
Debug.WriteLine("Foo.cs - addParameter - Exception found: " + e.InnerException);<br />
return false;<br />
}<br />
}<br />
<br />
}<br />
Thanks,
Stuart
|
|
|
|
|
As metioned elsewhere in the thread, it's very possible that the debugger is evaluating the properties.
Why are you using a property to move data in the class? That contradicts what a property is intended for. Just make it a method, and the code almost makes sense.
Despite everything, the person most likely to be fooling you next is yourself.
|
|
|
|
|
There is nothing in the code you have posted that would do that, although its obvious that you've missed out some of your original code as there are no m_ParamValue,m_ParamDataType etc variables defined.
However, the fact that a get accessor invokes the method you think is being called, makes me think you have a watch defined somewhere in the IDE which is being evaluated as soon as this object comes into scope.
|
|
|
|
|
Does this happen in Release mode?
I suspect the debugger is pulling all the protected properties to stick in the watch window
|
|
|
|
|
A former co-worker got stung with that one LOL...I had a good laugh. He was getting quite pissed off and swearing at these properties because they were getting called before running code that accessed them. I looked down at his watch window & had a big fat laugh.
Anyway, To the poster: If you've added these properties to the watch window OR if you even mouse over them while debugging, the code inside will be executed by the debugger WITHOUT stopping at your breakpoints inside the get/set.
|
|
|
|
|
Hi,
Thanks for this post; I removed the watch items related to the instantiated object, and this has resolved the issue with all methods being called.
Thanks,
Stuart
|
|
|
|
|
When I run in Release mode I get the same outcome.
|
|
|
|
|
Are you running in release mode through the IDE? i.e. debugging the release mode?
Is the "AddParameter" in your watch window? If so, remove it. In fact, remove everything from your watch window and DON'T use the mouseover in the debugger to see the public property value either. It will cause the code in the property to run and breakpoints will be ignored.
|
|
|
|
|
G'day,
I am quite new, developing C# applications and now I stuck. Maybe one of you guys might help me. I build a TreeView using a DataTemplate for displaying the item nodes. There are different type of item node. For one type I want to create a context menu. So far so good. When I click the item in the context menu, I need to get the object which is the source of the node item.
Here are the interesting code parts:
At first the XAML-Part:
<code>
<treeview name="tvExplorer">
<treeview.itemtemplateselector>
<pe:projectexplorertemplateselector />
</treeview.itemtemplateselector>
<treeview.resources>
<hierarchicaldatatemplate x:key="ProjectOpenTemplate" datatype="{x:Type pebe:Project}" itemssource="{Binding Path=ContentCategories}">
<stackpanel orientation="Horizontal">
<image source="../Media/applications_system.png" margin="1 1 2.5 1" width="16" height="16" />
<textblock text="{Binding Path=Name}" margin="2.5 1 1 1" />
<stackpanel.contextmenu>
<contextmenu name="potContext" opened="potContext_Opened">
<menuitem header="Close project" name="potContextClose" click="potContextClose_Click" />
<menuitem header="Rename" name="potContextRename" click="potContextRename_Click" />
<menuitem header="Properties" name="potContextOpenWith" />
</contextmenu>
</stackpanel.contextmenu>
</stackpanel>
</hierarchicaldatatemplate>
...
</treeview.resources></treeview></code>
Now the DataTemplateSelector:
<code>
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
FrameworkElement fe = container as FrameworkElement;
if (fe != null)
{
DataTemplate pot = fe.TryFindResource("ProjectOpenTemplate") as DataTemplate;
DataTemplate pct = fe.TryFindResource("ProjectCloseTemplate") as DataTemplate;
DataTemplate potCategories = fe.TryFindResource("ProjectCategoriesTemplate") as DataTemplate;
if (item is Project){
Project objProject = item as Project;
if (objProject.IsOpen && pot != null) {
return pot;
}
if (!objProject.IsOpen && pct != null) {
return pct;
}
}
...
</code>
And here comes the part where I am stucked, the click event for context menu item :
<code>
private void potContextClose_Click(object sender, RoutedEventArgs e)
{
MenuItem objMnuItem = sender as MenuItem;
var temp = VisualTreeHelper.GetParent(objMnuItem);
StackPanel stck = temp as StackPanel;
//How do I get tree node, which has opened the context menu
</code>
Unfortunately the right clicked tree node must not be the currently selected tree node.
Any ideas would be very appreciated.
Thanks in advance.
Rob
<div class="ForumMod">modified on Friday, February 29, 2008 10:45 AM</div>
|
|
|
|
|
RobSmith77 wrote: //How do I get tree node, which has opened the context menu
Never worked with WPF/XAML or .NET3, yet, not sure I ever want to but will probably have to, and this is from memory but I believe I dealt with that in the past by handling a mouse message like maybe rightclick and use the TreeView.HitTest or something to discover the node and cache it for use in the context menu handler.
Hope that helps
led mike
|
|
|
|
|
I will check this on monday, now it is time for weekend.
Have a nice weekend too and thanks for answering.
|
|
|
|
|
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using System.Data.SqlClient;
namespace GUI
{
public partial class GUI : Form
{
public GUI()
{
InitializeComponent();
}
private void GUI_Load(object sender, EventArgs e)
{
}
private void btnCreate_Click(object sender, EventArgs e)
{
if (ifthursday())
{
CreateDatabase(GetDatabasename());
CreateDatatable(GetTableName(), GetDatabasename());
}
}
///
/// Gets the name of the database from datetime picker and returns the value to the createDatabase Method
///
/// <returns>
///
public void Kill()
{
return;
}
public string GetDatabasename()
{
string namedatabase = dateTimePicker1.Value.ToString("MMdd");
string nameDB = "CustList_PGE_" + namedatabase;
MessageBox.Show("The name of the database will be CustList_PGE_" + namedatabase);
return nameDB;
}
public bool ifthursday()
{
//string dayisthursday= dateTimePicker1.Value.ToString("")
if (dateTimePicker1.Value.DayOfWeek.ToString().Equals("Thursday"))
{
MessageBox.Show("Thursday");
}
else if (MessageBox.Show("The selected date is not Thursday,Do you want to continue?", "Options", MessageBoxButtons.YesNo,MessageBoxIcon.Warning) == DialogResult.No)
{
return false;
}
return true;
}
///
/// Gets the name of the table from the datetime picker and returns the value to the createDatatable Method
///
/// <returns>
public string GetTableName()
{
string nameTable = dateTimePicker1.Value.ToString("MMddyy");
string nameTB = "CustList_PGE" + nameTable;
MessageBox.Show("The name of the Table will be CustList_PGE" + nameTable);
return nameTB;
}
//public void con()
//{
// Businesslayer.Businesslayer newobj = new Businesslayer.Businesslayer();
//}
///
///Creates an object to communicate to the Business Layer to create the DataBase
///
/// <param name="dbName" />
public int CreateDatabase(string dbName)
{
Businesslayer.Businesslayer createObj = new Businesslayer.Businesslayer();
int i=createObj.createDatabase(dbName);
if (i == 1801)
{
MessageBox.Show("The Database already exists");
return false;
}
}
///
/// Creates an object to communicate to the Business Layer for creating the Datatable
///
/// <param name="tableName" />
/// <param name="dbName" />
public void CreateDatatable(string tableName,string dbName)
{
Businesslayer.Businesslayer tableObj = new Businesslayer.Businesslayer();
tableObj.createTable(tableName, dbName);
}
}
}
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SqlClient;
namespace Businesslayer
{
public class Businesslayer
{
//public void createObject()
//{
// Datalayer.Datalayer obj = new Datalayer.Datalayer();
//}
public int createDatabase(string databaseName)
{
Datalayer.Datalayer createObj = new Datalayer.Datalayer();
int i = createObj.CreateDatabase(databaseName);
return i;
}
public void createTable(string tableName,string dbName)
{
Datalayer.Datalayer tableObj = new Datalayer.Datalayer();
tableObj.createTable(tableName, dbName);
}
public void get(SqlException ex)
{
}
}
}
>>>>>>>>>>>>>>>>>>>
using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SqlClient;
using System.Data;
using System.Configuration;
namespace Datalayer
{
public class Datalayer
{
string Test3;
string Testldf3;
SqlConnection conObj;
public void conSql()
{
try
{
//string con = "Data Source=TSPL-DEV07;Initial Catalog=PGEImport;Integrated Security=True";
conObj = new SqlConnection();
conObj.ConnectionString = ConfigurationSettings.AppSettings["con"];
if (conObj.State == ConnectionState.Closed)
{
conObj.Open();
}
}
catch (SqlException ex)
{
}
}
public int CreateDatabase(string nameDB)
{
int value =0;
try
{
conSql();
SqlCommand cmdObj = new SqlCommand();
cmdObj.Connection = conObj;
cmdObj.CommandText = "CreateDataBases";
cmdObj.CommandType = System.Data.CommandType.StoredProcedure;
cmdObj.Parameters.AddWithValue("@databaseName", nameDB);
// cmdObj.Parameters.AddWithValue("@databaseName_Log", nameDB + "CustList_PGE_0228_log");
cmdObj.Parameters.AddWithValue("@databaseName_Log", nameDB + "_log");
//CreateStrings(nameDB);
string Assign = CreateStrings(nameDB);
CreateConnections(Assign, cmdObj);
string Assignldf = CreateStringsldf(nameDB);
CreateConnectionsldf(Assignldf, cmdObj);
value = cmdObj.ExecuteNonQuery();
#region Comments
// CreateConnections(CreateStrings());
//cmdObj. = ConfigurationSettings.AppSettings["pathM"];
//string Test = ConfigurationSettings.AppSettings["pathM"];
//string Test1 = nameDB+".mdf";
//string Test2 = Test;
//string Test3 = Test2 + Test1;
//cmdObj.Parameters.AddWithValue("@mdfName",Test3);
//string Testldf = ConfigurationSettings.AppSettings["pathL"];
//string Testldf1 = nameDB + ".ldf";
//string Testldf2 = Testldf;
//string Testldf3 = Testldf2 + Testldf1;
// cmdObj.Parameters.AddWithValue("@ldfName", Testldf3);
//cmdObj.Parameters.AddWithValue("@ldfName",Testldf);
//cmdObj.CommandText = ConfigurationSettings.AppSettings["pathL"];
//cmdObj.Parameters.AddWithValue("@mdfName", @"C:\mssql1\data\0225.mdf");
//cmdObj.Parameters.AddWithValue("@ldfName", @"C:\mssql1\data\0225.ldf");
#endregion
return value;
}
catch (SqlException ex)
{
if (ex.Number == 1801)
{
value = 1801;
}
return value;
}
finally
{
if (conObj.State == ConnectionState.Open)
{
conObj.Close();
}
}
}
public string CreateStrings(string nameDB)
{
string Test = ConfigurationSettings.AppSettings["pathM"];
string Test1 = nameDB + ".mdf";
string Test2 = Test;
Test3 = Test2 + Test1;
return Test3;
}
public string CreateStringsldf(string nameDB)
{
string Testldf = ConfigurationSettings.AppSettings["pathL"];
string Testldf1 = nameDB + ".ldf";
string Testldf2 = Testldf;
Testldf3 = Testldf2 + Testldf1;
return Testldf3;
}
public void getstringfromBL()
{
}
//public void CreateConnections(string Test3, Datalayer cmdObj)
//{
// cmdObj.Parameters.AddWithValue("@mdfName", Test3);
//}
public void CreateConnections(string Assign,SqlCommand cmdObj)
{
cmdObj.Parameters.AddWithValue("@mdfName", Test3);
}
public void CreateConnectionsldf(string Assignldf,SqlCommand cmdObj)
{
cmdObj.Parameters.AddWithValue("@ldfName", Testldf3);
}
public void createTable(string tableName, string nameDB)
{
conSql();
SqlCommand cmdObj = new SqlCommand();
try
{
cmdObj.Connection = conObj;
cmdObj.CommandText = "createTable";
cmdObj.CommandType = System.Data.CommandType.StoredProcedure;
cmdObj.Parameters.AddWithValue("@databaseName", nameDB);
cmdObj.Parameters.AddWithValue("@databaseTable", tableName);
cmdObj.Parameters.AddWithValue("@primaryKey", @"ClientCoCustListID");
cmdObj.ExecuteNonQuery();
}
catch (Exception ex)
{
}
finally
{
}
}
}
}
|
|
|
|
|
|
35 postings, 5 of them voted 1, with one 2 voter. Think that speaks for itself.
I'm largely language agnostic
After a while they all bug me
|
|
|
|
|
Trustapple, Trustapple, Trustapple.... you just don't learn do you?
|
|
|
|
|
Last I checked, the CodeProject site didn't become a source code repository. You might want to ask an actual question on this code before someone start flaming you...oh, wait... My bad! I was too late!
|
|
|
|
|
You might want to consider investing in a source control system or moving this to the recylce bin. Either way, don't clutter up the forums. But I do have to catch you with this bit:
Trustapple wrote: try
{
cmdObj.Connection = conObj;
cmdObj.CommandText = "createTable";
cmdObj.CommandType = System.Data.CommandType.StoredProcedure;
cmdObj.Parameters.AddWithValue("@databaseName", nameDB);
cmdObj.Parameters.AddWithValue("@databaseTable", tableName);
cmdObj.Parameters.AddWithValue("@primaryKey", @"ClientCoCustListID");
cmdObj.ExecuteNonQuery();
}
catch (Exception ex)
{
}
finally
{
}
}
Never ever catch an exception and do nothing with it - and certainly don't have a finally block that does nothing.
|
|
|
|
|