0
votes

Hi Is it acceptable to override the "Render" method when creating a custom web part in SharePoint? I have a web part which inherits from System.Web.UI.WebControls.WebPart. I add the controls to the controls collection in "CreateChildControls" and then override the "Render" method to render the html and the controls.

I am having some issues when I use a drop down list, but I want to know if my above approach is correct or not before I try to fix the issue with binding a drop down list.

Edited

I initialize my drop down lists and add it to the controls collection in "CreateChildControls". At the end of this method, I call "BindData" which binds my drop down list and if I am editing an existing record, it binds the drop down list data and sets the correct selected index. I then render the controls in the "Render" method. Here is a code snippet

protected override void CreateChildControls()
        {
            base.CreateChildControls();
            this.EnsureUpdatePanelFixups();

 ddlClient = new DropDownList();
            ddlClient.ID = "ddlClient";
            ddlClient.SelectedIndexChanged += new EventHandler(ddlClient_SelectedIndexChanged);
            ddlClient.AutoPostBack = true;
            ddlClient.ValidationGroup = __VALIDATIONGROUP;
            ddlClient.Width = ObjCtrlWidth;

            upClient = new UpdatePanel();
            upClient.ID = "upClient";
            upClient.UpdateMode = UpdatePanelUpdateMode.Conditional;
            upClient.ContentTemplateContainer.Controls.Add(ddlClient);

            this.Controls.Add(upClient);

//More controls here

BindData();
}

"ddlClient is a "DropDownList", "upClient" is a update panel. Yes, I have one update panel for one drop down list and I update other update panels using the update method.

This is the "Render" method

protected override void Render(System.Web.UI.HtmlTextWriter writer)
        {
//stuff here

    writer.RenderBeginTag(System.Web.UI.HtmlTextWriterTag.Td);
            upClient.RenderControl(writer);
            writer.RenderEndTag();

//stuff here
}

My "BindData" method calls other bind methods which bind different drop down lists and this is how one of them is binded

    private void BindData()
            {
                BindClientTypes();
                //binding other drop down lists here

//If an existing record isbeing edited, this method will get the data from db and bind all the controls               
BindMEA();
            }

private void BindClientTypes()
        {
            DataTable dt = DB.GetAllClientTypes();

            if (dt == null)
            {
                ltGlobalErrorMsg.Text = GlobalErrorMessage;
                ltGlobalErrorMsg.Visible = true;
            }
            else
            {
                ddlClient.ClearSelection();
                ddlClient.DataSource = dt;
                ddlClient.DataValueField = "ID";
                ddlClient.DataTextField = "Name";
                ddlClient.DataBind();
                ddlClient.Items.Insert(0, PleaseSelectItem);
                ddlClient.ClearSelection();
            }
        }

In my BindMEA, I do the following

ddlClient.ClearSelection();
ddlClient.Items.FindByValue(objMea.ClientTypeID.ToString()).Selected = true;

I get an error which says, that a control cannot have two selected indexes. But There is only one at any given time. The state of the drop down changes, but when it comes to Render it bombs out.

I cannot understand why

Thanks.

2
What happens if you don't do the .Selected = true. Which item is then selected?Mikael Svenson
You're clearing the selection which is correct. My next guess could be, are you using the PleaseSelectItem in several drop-downs, meaning the same instance of it? Read the comments on - geekswithblogs.net/ranganh/archive/2006/05/03/77072.aspxMikael Svenson
Yes, I did not realize I was using it in different places.iJK
You shouldn't override the Render() but RenderContents() instead. andrewconnell.com/blog/archive/2008/02/18/…Flo
Yes, I know about that but I am not doing anything with the WPSC so I just ignored it. I did change my code now. Thanks for the reminder :-)iJK

2 Answers

1
votes

RenderMethod is ok.

Here's a better solution for you. Line 2 and 3 are the important parts:

ddlClient.Clear();
ddlClient.AppendDataBoundItems = true;
ddlClient.Add( new ListItem("Please Select" ); // Important to have a new instance
ddlClient.DataSource = dt;
ddlClient.DataValueField = "ID";
ddlClient.DataTextField = "Name";
ddlClient.DataBind();
ddlClient.ClearSelection();
0
votes

So I figured out why the error happens after 6+ Hours...

If I comment this line in my method where I bind the drop down list

//ddlClient.Items.Insert(0, PleaseSelectItem);

Then I am able to bind the grid and set a selected index.

So My Bind method looks like this

private void BindClientTypes()
        {
            DataTable dt = DB.GetAllClientTypes();

            if (dt == null)
            {
                ltGlobalErrorMsg.Text = GlobalErrorMessage;
                ltGlobalErrorMsg.Visible = true;
            }
            else
            {
                ddlClient.DataSource = dt;
                ddlClient.DataValueField = "ID";
                ddlClient.DataTextField = "Name";
                ddlClient.DataBind();
                //ddlClient.Items.Insert(0, PleaseSelectItem);
            }
        }