Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can i call a function defined in one partial class from another partial class. Is it possible?

I have created two partial classes for a web page.

Now i have given a defination of one function say submit() that i m calling at OnSubmit event of button.

But this function is not being called, the program doesnot compiles as it is not able to search the defination of function, which was defined in another partial class. Is it possible to call this function or i have to give defination of function in same file where i m calling it

eg

<%@ Page Language="C#" MasterPageFile="~/Master Pages/LeftMenu.master" AutoEventWireup="true" CodeFile="Registration.aspx.cs" Inherits="Web_Pages_Authentication_Login_Management_Registration" Title="Registration" StylesheetTheme="Default Theme 1"  %>

Registration.aspx.cs

public partial class Web_Pages_Authentication_Login_Management_Registration : System.Web.UI.Page
{
    private string firstName;
    private string lastName;
    private string userName;
    private string userPassword;
    private string primaryEmail;
protected void btnSubmit_Click(object sender, EventArgs e)
    {
       Display();
    }
}

Registration_Database.cs

   public partial class Web_Pages_Authentication_Login_Management_Registration 
    {
       const string dbFirstName = "@FirstName";
       const string dbLastName = "@LastName";
       const string dbUserName= "@UserName";
       const string dbUserPassword = "@UserPassword";
       const string dbPrimaryEmail = "@PrimaryEmail";  

       void Display()
          {
              firstName="XYZ"; //This variable is not accessible when i put both files in different directories
          }
    }

I am getting following error

Error   1   'Web_Pages_Authentication_Login_Management_Registration' does not contain a definition for 'Display' and no extension method 'Display' accepting a first argument of type 'Web_Pages_Authentication_Login_Management_Registration' could be found (are you missing a using directive or an assembly reference?) C:\Documents and Settings\Administrator\Desktop\Online Test\Web Pages\Authentication\Login Management\Registration.aspx.cs  78  20  C:\...\Online Test\

Registration.aspx, Registration.aspx.cs, Registration_Database.cs are three files that are not in App_Code folder but belongs to one folder only out of which Registration.aspx.cs, Registration_Database.cs are partial classes and Registration.aspx is my design file. Plz let me know if u want to know some more info about my problem

I am not using DLL Files. No precompiled code

like image 760
Shantanu Gupta Avatar asked Jan 05 '10 11:01

Shantanu Gupta


People also ask

What will happen if there is an implementing partial without a defining partial in a partial method?

Similar to a partial class, a partial method can be used as a definition in one part while another part can be the implementation. If there is no implementation of the partial method then the method and its calls are removed at compile time. Compiler compiles all parts of a partial method to a single method.

What are all the rules to follow when working with partial class definition?

The partial keyword indicates that other parts of the class, struct, or interface can be defined in the namespace. All the parts must use the partial keyword. All the parts must be available at compile time to form the final type. All the parts must have the same accessibility, such as public , private , and so on.

Can different parts of a partial class inherit from different interfaces?

Different parts of a class or struct may inherit from different interfaces. If any part is declared abstract, then the whole class, interface or struct is considered abstract. If any part is declared sealed, then the whole whole class, interface or struct is considered sealed.

Can partial classes inherit?

Inheritance cannot be applied to partial classes.


2 Answers

I think the problem you're experiencing is because your website is dynamically compiled, rather than a precompiled web application.

When the ASP.NET page is first accessed, the compiler will only look in the code behind file, and won't search all the other .cs files for possible extra code for the same class. Thus, it will never see the implementation of display(), which in turn causes the code behind file to fail to compile.

I would certainly not use a method like this for what you seem to want to do, but you could define a custom class that derives from System.Web.UI.Page and have your actual page derive from the new class. The class definition would have to be in App_Code for a dynamically compiled website.

Registration.aspx.cs:

public partial class Web_Pages_Authentication_Login_Management_Registration : MyPage
{
    protected void btnSubmit_Click(object sender, EventArgs e)
    {
        Display();
    }
}

App_Code\MyPage.cs:

public class MyPage : System.Web.UI.Page
{
    protected void Display()
    {
        // ...
    }
}

In any case: you certainly shouldn't use static variables the way you are using them, this will cause problems if multiple people are using your site at the same time. Frankly, your example doesn't make much sense to me. Maybe if we had more information about what you're trying to accomplish, we could provide a best-practise way to do it.

Note that in your example, putting the second file in App_Code directory will not make it work. That would simply result in two classes with the exact same class name (provided the namespaces match of course). It really doesn't like that :)

like image 115
Thorarin Avatar answered Sep 24 '22 22:09

Thorarin


Yes, it is possible to call a method on a (partial) class.

Partial classes are only a feature of some languages (such as C#) - they don't exist in IL, as they are compiled together into a single class.

However, it can sometimes be tricky since partial class declarations must be totally identical for this merging to happen. That includes the namespace, so this might be your problem.

As an illustration, this will result in a single class:

namespace MyNamespace
{
    public partial class MyClass { }

    public partial class MyClass { }
}

Thre resulting class is MyNamespace.MyClass. However, this will result in two different classes:

namespace MyNamespace
{
    public partial class MyClass
    {
        public void MyMethod();
    }
}

namespace MyOtherNamespace
{
    public partial class MyClass { }
}

This will produce two classes: MyNamespace.MyClass and MyOtherNamespace.MyClass. In this case, a call to this.MyMethod from MyOtherNamespace.MyClass will not work.

like image 34
Mark Seemann Avatar answered Sep 22 '22 22:09

Mark Seemann