Search code examples
c#asp.netwebusercontrol

Webusercontrol is inaccessible due to its protection level


Compiler Error Message: CS0122: 'Controls_Arcade_StarDisplay.Stars' is inaccessible due to its protection level

I've checked other SO threads but can't make much sense of them. This control is being used inside another webusercontrol. Whenever I try and do anything with it it throws this error. The class in question is this:

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="StarDisplay.ascx.cs" Inherits="Controls_Arcade_StarDisplay" %>
<asp:Panel runat="server" ID="Stars" />

Code behind:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Runtime.CompilerServices;

public partial class Controls_Arcade_StarDisplay : System.Web.UI.UserControl
{
    public double Rating { get; set; }
    public string Tooltip { get; set; }

    protected void Page_Load(object sender, EventArgs e)
    {
        string CSSClass = "star-rating s-";
        if (Rating < 0.25)
            CSSClass += "0";
        else if (Rating < 0.75)
            CSSClass += "05";
        else if (Rating < 1.25)
            CSSClass += "1";
        else if (Rating < 1.75)
            CSSClass += "15";
        else if (Rating < 2.25)
            CSSClass += "2";
        else if (Rating < 2.75)
            CSSClass += "25";
        else if (Rating < 3.25)
            CSSClass += "3";
        else if (Rating < 3.75)
            CSSClass += "35";
        else if (Rating < 4.25)
            CSSClass += "4";
        else if (Rating < 4.75)
            CSSClass += "4";
        else if (Rating < 1.25)
            CSSClass += "1";
        else if (Rating < 4.75)
            CSSClass += "45";
        else
            CSSClass += "5";
        Stars.CssClass = CSSClass;

        if (Tooltip != null)
            Stars.ToolTip = Tooltip;
    }
}

The control is registered in web.config:

    <pages validateRequest="false" smartNavigation="false" clientIDMode="Static">
        <controls>
            <add tagPrefix="Scirra" src="~/Controls/Arcade/GameOverview.ascx" tagName="GameOverview"/>
            <add tagPrefix="Scirra" src="~/Controls/Arcade/Stars/StarDisplay.ascx" tagName="StarDisplay"/>
        </controls>
    </pages>

The start display control is appearing inside the game overview control.

Thanks for any help, completely stuck! Other questions refer to getting properties of the controls I don't understand, or changing things in the designer I can't find either.


Solution

  • This means that you have something in your user control called Stars and it is probably defined as private or protected.

    The issue is that this is a Web Site and not a Web Application and in a Web Site, .Net automatically creates the runat="server" controls as protected properties, so they cannot be exposed outside of the User Control or its direct inheritors.

    So there are two possible options:

    1. Convert the web site to a web application. This will cause a designer file to be created that contains the definitions of the controls. You can then take the control out of the designer file, place it in your codebehind, and change the access level to public.

    2. Since this is a control that will be accessed from other controls, a better design than exposing the control directly is to provide interaction methods that those other controls can use in order to encapsulate the behavior within this control. For example, exposing a SetRating method that accepts the rating and updates the Stars panel internally.

    Option #2 is definitely a better option from a design standpoint.