tags:

views:

1603

answers:

4

I have a form that has a public property

public bool cancelSearch = false;

I also have a class which is sitting in my bll (business logic layer), in this class I have a method, and in this method I have a loop. I would like to know how can I get the method to recognise the form (this custom class and form1 are in the same namespace).

I have tried just Form1. but the intellisense doesn't recognise the property. Also I tried to instantialize the form using Form f1 = winSearch.Form1.ActiveForm; but this too did not help

Any ideas?

+1  A: 

Your question is really not clear. You might want to edit it.

Advice

The form shouldn't pass to your business logic layer...

Solutions to your problem

BUT if you really want to (BUT it's really not something to do), you need to pass the reference. You can do it by passing the reference in the constructor of your class, or by a property.

Method with Constructor

public class YourClass
{
 private Form1 youFormRef;

 public YourClass(Form1 youFormRef)
 {
  this.youFormRef = youFormRef;
 }
    public void ExecuteWithCancel()
    {
  //You while loop here
            //this.youFormRef.cancelSearch...
    }
}

Method with Property

public class YourClass
{
    private Form1 youFormRef;

 public int FormRef
    {
        set
        {
            this.youFormRef = value;
        }

        get
        {
            return this.youFormRef;
        }
    }

    public void ExecuteWithCancel()
    {
  //You while loop here
            //this.youFormRef.cancelSearch
    }
}
Daok
Yeah - gathered the question was not too clear, sorry late at night here, thanks for the input anyways - Mitchel was spot on...
Michael L
+2  A: 

When you are calling the business logic that needs to know the information pass a reference of the form to the method.

Something like.

public class MyBLClass
{
    public void DoSomething(Form1 theForm)
    {
        //You can use theForm.cancelSearch to get the value
    }
}

then when calling it from a Form1 instance

MyBlClass myClassInstance = new MyBlClass;
myClassInstance.DoSomething(this);

HOWEVER

Really you shouldn't do this as it tightly couples the data, just make a property on your BL class that accepts the parameter and use it that way.

Mitchel Sellers
Thanks Mitchel, thats exactly what I needed :)
Michael L
+1  A: 

I think you should look at how to stop a workerthread.

I have a strong feeling that you have a Button.Click event handler that runs your business logic and another Button.Click that sets your cancelSearch variable. This won't work. The GUI thread which would run your business logic, won't see the other button being clicked. If I'm right you should very much use a worker thread.

Guge
A great suggesion, Guge, you're pretty observant, I might consider going down that road with this little app I am working on... but really its just an app I will use myself, its basically a vista/windows 2008 search replacer, because the search with Vista is really bad.
Michael L
+1  A: 

As the other (very quick) responses indicate, you need to have an instance variable in order to get your intellisence to show you what you need.

Your app by default does not have a reference to the main form instance, if you look at your program.cs file you will see that the form is constructed like so...

Application.Run(new Form1());

so you have a couple options, you could create a global var (yuck) and edit your program.cs file to use it..

Form1 myForm =  new Form1();
Application.Run(myForm);

Pass a reference to the business object from your running form like some others have suggested

myBusinessObj.DoThisThing(this);

or find your form in the Application.OpenForms collection and use it.

Tim Jarvis