|
hi,
I have several classes in my application, one of them called 'database' which handles all the database connections etc.. The concept of the program is that an SQL query is executed on a database, and parts of the results are listed in a listBox on the main form. To simplify this process, i have created a function called addList to the frmMain class which is called with the appropriate arguments to add the data to the listBox. However, because this function is being called from a class which has been created by code in frmMain, the database class does not seem to recognise that there is a function called addList, and says there needs to be an object reference or something. How do i call the addList function in frmMain from the database class? a quick reply would be appreciated,
thanks in advance,
eddmun
|
|
|
|
|
Let's say you have something like this:
namespace MyCompany.MyDepartment.MyApplication
{
public class frmMain
{
public void AddList(string[] args)
{}
}
}
namespace MyCompany.MyDepartment.MyApplication
{
public class database
{}
}
then all you may need to do is this:
change AddList from public to static
in your database class add a using MyCompany.MyDepartment.MyApplication;
Then see if it compiles.
_____________________________________________
Of all the senses I could possibly lose, It is most often the one called 'common' that gets lost.
|
|
|
|
|
Your database class needs to be able to access an instance of your form if you need to call an instance method (to make the method static would also be problematic since you can only add data to your UI in an instance of the form). If your form, for example, is what creates the instance of your database class, pass this (a self-reference to the form) to the database class's constructor or something. Another way - although not recommended - is to provide a static property on your form class that gets an instance of the form, which the form can set in its constructor like so:
public class MyForm : Form
{
public MyForm()
{
instance = this;
}
private static MyForm instance;
public static MyForm Instance { get { return instance; } }
} The problem with this is that multiple instance of your form will "reset" the static field (and be returned in the property). If you're sure that you'll never have more than one instance of this form, this would work in a pinch, though something like the first way I mentioned (passing an instance of the form to your database class) might be better if possible.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
I posted this question late last night, didn't get a satisfactory answer, and now all the experts can't see the post. So I will post one more time.
I have a class with a private event/delegate model.
[Serializable]
public class MyClass
{
private SomeCollection collection = new SomeCollection();
public MyClass()
{
this.collection.Changed += new EventHandler(this.SomePrivateMethod);
}
private void SomePrivateMethod(object sender, EventArgs e)
{
}
}
I can serialize the above class without problem, however, upon deserialization, I recieve an exception telling me "delegates to non-public methods cannot be deserialized." If I change the accessor of SomePrivateMethod to public the whole things works. But I really don't want to have to expose SomePrivateMethod as public.
So what do I do here, how can I serialize and deserialize the above class without SomePrivateMethod having a public accessor?
---------------------------
He who knows that enough is enough will always have enough.
-Lao Tsu
|
|
|
|
|
If you are doing XMLSerializer then only public properties that contain public setters and getters will serialize/deserialize. However if you deployed using the binary serializer, then you should get the behavior you want.
If this object is being passed between application domains via remoting, and you happen to use the SOAP formatters, that is your problem. You can change your remoting channel definition and that should behave more in the fashion you want them to behave. So you would define the channel as follows:
public static void InitializeRemoting(bool DebugState)
{
try
{
if (DebugState == false)
{
channel = new HttpChannel(null,new BinaryClientFormatterSinkProvider(),new BinaryServerFormatterSinkProvider());
System.Diagnostics.Debug.WriteLine("System has not been requested to run in debug mode.", "Remote Communication Manager");
}
else
{
channel = new HttpChannel(null,null,null);
runningInDebugMode = true;
System.Diagnostics.Debug.WriteLine("System has been requested to run in debug mode.", "Remote Communication Manager");
}
channel.Properties["proxyName"] = null;
channel.Properties["useDefaultCredentials"] = "true";
ChannelServices.RegisterChannel(channel);
}
catch (System.Exception exc)
{
throw new System.Exception("Problem initializing the remote object channel", exc);
}
}
The debug work is to switch over to the SOAP converter in the event I make remote changes that return the famous 'version incompatability' error. The SOAP channel lets the true exception pass through so that I can see where I screwed up.
I hope this helps, and if not then just let me know where you need additional direction.
_____________________________________________
Of all the senses I could possibly lose, It is most often the one called 'common' that gets lost.
|
|
|
|
|
Thanks for the reply. I am using remoting with soap formatters, so you hit the nail on the head.
So, what code in particular makes the difference - the channel properties? Or just passing in BinarySink providers?
In reply to your other post, yeah you're the 3rd person to recommend Ingo Rammer's website/FAQ/book to me. My boss just purchased Rammer's remoting book for me, so I'll definitely be having a peak at this in the near future.
---------------------------
He who knows that enough is enough will always have enough.
-Lao Tsu
|
|
|
|
|
One thing that is not very broadly spoken is the fact that even if IIS serves your remoting objects, the default serial formatter is binary. (I did the same thing as you....assumed SOAP would be best with an IIS server)
By setting the formatters at the time you define your channel, you force everything to binary formatters. The BinarySinkProvider is your serializer/deserializer and is the one responsible for marshaling your event across application boundaries. Besides having your remoting work.....you will also find that it will go much faster than if you could have flown through SOAP. Also keep in mind that you need to set your TypeFilter to Full once you move to the 1.1 Framework in order to get your delegate marshalled to your client code.
I learned a heck of alot from the Ingo Rammer book and even more once I deployed. But I did find that his suggestions are aimed at the enterprise application development ---> and I deployed many items that would fly contrary to his suggestions. But my application is internal, will never be exposed to the public, and has a maximum of 5-6 users per server! Those are the fun applications to write since scalability and speed never enter into the equation.
Glad to have been of help.
_____________________________________________
Of all the senses I could possibly lose, It is most often the one called 'common' that gets lost.
|
|
|
|
|
I should also add that if you are marshaling delegates you may want to visit the Ingo Rammer FAQ [^]and look into the impacts of doing this. Especially if you are moving to 1.1 Framework sometime soon.
BTW -- the prior code is for the 1.0 Framework and has not got the additions for clearing security level for the 1.1 Framework conversations.
_____________________________________________
Of all the senses I could possibly lose, It is most often the one called 'common' that gets lost.
|
|
|
|
|
I am drawing several lines on an image. I don't want it to be of same color as the background (i.e, image). I want the brush so that it changes the color over the image length depending upon the image background. Does any one know a way to create a brush at runtime so that it does not mix with the image background.
PS: I want similar behavior as the tool that is used to "cut" image parts in paint brush.
Thank you
|
|
|
|
|
What exactly do you mean? You want a marquee selection box like many graphics packages have? There are articles that cover this here on CodeProject. Just search for "marquee" or "marching ants" (a common moniker).
If you want a brush that effectively inverts the colors behind it, you'll most likely have to extend the Brush class, which involves P/Invoking GDI and/or GDI+ calls (there's no pure .NET way of creating a brush: all functionality is provided by GDI+).
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
Yes I am looking for brush that effectively inverts the colors behind it.
I will see If I can solve it.
Thanks for your help.
|
|
|
|
|
I have searched the documentation on how to do the following without success:
How to give the ASPNET account write access to an existing folder? I want to do this from C# code. I could start the CACLS.exe program from C#, but there is an annoying console window to confirm my action.
Any help is appreciated. Thanks.
My articles and software tools
|
|
|
|
|
|
|
This has to do with code access security permissions, which is not what the poster is looking for. The question is about file security (i.e., NTFS permissions).
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
|
Luckily Microsoft has stated this will be integrated into the BCL with the next release of the framework.
- Nick Parker My Blog
|
|
|
|
|
I've heard rumors but no substantial proof. I take it they mean .NET 2.0?
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
|
|
Cool, thanks!
BTW, it's not that I didn't believe that you saw something, just that it came from a reliable source. MSDN bloggers are good enough for me!
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
|
When using the System.Web.Mail namespace and attempting to send a carbon copy 'Cc' to another mail recipient on a different domain then the 'To' recipient, I get an denyed relay error (#550) from the 'To's mail server. I've tried with several servers with same results. I must be doing something wrong.
1.1 Framework, 2002 Dev Envir.
Any help please.
Example:
MailMessage mm = new MailMessage();
mm.From = "sender@someisp.com";
mm.To = "recipient@anotherisp.com";
mm.Cc = "anotherrecipient@adifferentisp.com;";
mm.Subject = "Test Subject";
mm.Body = "Test Body";
SmtpMail.Send(mm);
If the 'Cc' is removed the process works as expected.
Rick Z
|
|
|
|
|
I haven't used ASP.NET yet, and maybe it's just a typo, but removing the semi-colon in the CC address may help.
John
"You said a whole sentence with no words in it, and I understood you!" -- my wife as she cries about slowly becoming a geek.
|
|
|
|
|
Thanks anyway John, but I've tried it many, many different ways and if I send the CC to the same domain as the TO it has to be there. Check out the following doc's pulled from microsoft help.
Gets or sets a semicolon-delimited list of e-mail addresses that receive a carbon copy (CC) of the e-mail message.
[C#]
public string Cc {get; set;}
A semicolon-delimited list of e-mail addresses that receive a carbon copy (CC) of the e-mail message.
Rick...
|
|
|
|