tags:

views:

44

answers:

3

I have created a user control UserVote that has property to find total vote on particular question.

Now I want to call it from an aspx page.

The control code-behind (UserVote.ascx.cs) looks like:

public partial class UserVote : System.Web.UI.UserControl
{
    protected void Page_Load(object sender, EventArgs e)
    {
        DataTable dtVoteInfo = ShowVoteDetail(objectType, objectId);
        if (dtVoteInfo != null)
        {
            if (dtVoteInfo.Rows.Count > 0)
            {
                int.TryParse(dtVoteInfo.Rows[0]["TOTAL_VOTE"].ToString(), out currentVote);
                int.TryParse(dtVoteInfo.Rows[0]["MY_VOTING"].ToString(), out myVoting);
            }
        }
        ltrVotes.Text = currentVote.ToString();
        hfCurrentVote.Value = currentVote.ToString();
        hfMyVote.Value = myVoting.ToString();

        // ...snipped for brevity...
    }
}

The control markup (UserVote.ascx) looks like:

<div class="vote-cell" style="width: 46px; height: 92px">
  <img src ="~/UserControls/Vote/Images/Arrow Up.png" 
        id = "voteupoff" 
        runat = "server" alt ="vote up" 
        class="voteupImage" 
        style="height: 45px; width: 45px"/>
  <div class="vote" style ="text-align:center; color:#808185;font-weight:bold;">
    <asp:Literal ID="ltrVotes" runat="server" ></asp:Literal>
  </div>
  <img  src ="~/UserControls/Vote/Images/arrow_down.png" 
        id ="votedownoff" 
        runat = "server" alt = "vote down"
        class = "votedownImage" 
        style="height: 45px; width: 44px; margin-left: 0px;" />
</div>

My page code-behind (viewanswer.aspx.cs) looks like:

UserVote Voteing = (UserVote) **what i write here...**.findcontrol(voting)
Voteing.objectType =300;
Voteing.object id= 2;

My page markup (viewanswer.aspx) looks like:

<klmsuc:Voteing ID="Voteing" runat="server" />
+1  A: 

You have to declare public properties in the user control which you then use in your Page_Load event handler like this:

public partial class UserVote : System.Web.UI.UserControl
{
    public int ObjectType { get; set; }
    public int ObjectId { get; set; }

    protected void Page_Load(object sender, EventArgs e)
    {
        DataTable dtVoteInfo = ShowVoteDetail(ObjectType, ObjectId);
        ...
    }
}

In your aspx page assign values to those properties from the markup:

<klmsuc:UserVote ID="Voteing" runat="server" ObjectId="2" ObjectType="300" />

Or from the code-behind:

Voteing.ObjectType = 300;
Voteing.ObjectId = 2;
Monika
i am doing like that but control page is not executing....
Nishant
What is the page not executing?
Monika
In which event of the page are you assigning the values to the properties? Because you are using these values in the user control's page_load, you must assign those property values at latest in the page's load event.
Monika
i means while i give break point on ascx page then execution control can't reach there.
Nishant
when i am calling it..from aspx page.
Nishant
+1  A: 

Not sure if you're trying to access the currentVote value in the usercontrol from your ASPX page but if you are:

public partial class UserVote : System.Web.UI.UserControl
{
    private int _currentVode;
    private int _myVoting;

    // Move data access to OnInit because this otherwise Page_Load on page
    // fires before control Page_Load.
    protected override void OnInit(EventArgs e)
    {
        DataTable dtVoteInfo = ShowVoteDetail(objectType, objectId);
        if (dtVoteInfo != null)
        {
            if (dtVoteInfo.Rows.Count > 0)
            {
                int.TryParse(dtVoteInfo.Rows[0]["TOTAL_VOTE"].ToString(), 
                            out _currentVote);
                int.TryParse(dtVoteInfo.Rows[0]["MY_VOTING"].ToString(), 
                            out _myVoting);
            }
        }
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        ltrVotes.Text = _currentVote.ToString();
        hfCurrentVote.Value = _currentVote.ToString();
        hfMyVote.Value = _myVoting.ToString();

        // set img src snipped for brevity....
    }

    public int CurrentVote
    {
        get { return _currentVote; }
    }

    public int MyVoting
    {
        get { return _myVoting; }
    }
}

On the ASPX page add the following directive to register the control:

<%@ register src="~/UserVote.ascx" tagprefix="klmsuc" tagname="Voteing" %>

<!-- You had this already -->
<klmsuc:Voteing ID="Voteing" runat="server" />

In your ASPX code-behind:

int currentVote = Voteing.CurrentVote;
int myVote = Voteing.MyVoting;

If you're using VS2008 or later you shouldn't have to use FindControl. If you do then see Willem's answer.

Kev
A: 
uservote Voteing = (uservote) Page.FindControl("voting");

If that doesn't work you can try some homemade version of "FindControlRecursive", for example if the Page has a MasterPage. My version (actually used as an extension):

public Control FindControlRecursive(Control control, string id) {
    Control x = control.FindControl(id);
    foreach (Control c in control.Controls) {
        if (x == null) {
            x = c.FindControlRecursive(id);
        }
        else {
            break;                
        }                 
    }
    return x; 
}
Willem