I was involved in a MOSS project, where my client developed a webpart which is essentially a data entry form for a list using SharePoint Controls. The client ran into an issue, when he was trying to disable the Textfield control programmatically from the webpart for a certain set of users. The webpart used CreateChildControls() method to dynamically create the controls. This is a code snippet from CreateChildControls() within the webpart.
protected override void CreateChildControls()
{
       TextField txtTitle = new TextField();
       txtTitle.ListId = listGuid;
       txtTitle.ItemId = itemId;
       txtTitle.FieldName = "SampleTitle";
       Controls.Add(txtTitle);
 }
Currently there is no property available to change the Textfield control's state to disabled or read only mode. The following is a work-around to disable the control. This code registers a JavaScript function in the web part which in turn disables the controls and changes it to read only mode.
 Step 1. Add the following JavaScript function to a common script file which is referred from the master page.
<script type="text/javascript"> 
      /*This method returns the first object which 
        matches the tagname and part of the id passed as parameter*/         
    function getElementByPartOfID(idPart, tagName) 
    {            
        var tags = document.getElementsByTagName(tagName);
        for (var i=0; i < tags.length; i++) 
        {
            var tempString = tags[i].id;            
            if ( tempString.indexOf(idPart) >= 0 ) 
            {
                  return document.getElementById(tempString);
            }
        }
        return null;
     }
      </script>
 Step 2. Add the following code to CreateChildControls() method in your webpart as follows. This code iterates though the controls collection and dynamically creates a JavaScript function which disables the controls. 
// Create dynamic Javascript string to disable the text boxes
        StringBuilder strDisableScript = new StringBuilder();
        strDisableScript.Append("<script>\n");
        strDisableScript.Append(" disableitems();\n");
        strDisableScript.Append(" function disableitems()\n");
        strDisableScript.Append("  {\n");
        foreach (Control ctrl in Controls)
        {
            strDisableScript.Append("var ctl = getElementByPartOfID('" + ctrl.ClientID + "','input');\n");
            strDisableScript.Append("if(ctl !=null) ctl.disabled = true;\n");
        }
        strDisableScript.Append(" } </script> ");
        string uniqueScriptID = "disableScript_" + Guid.NewGuid();
        if (!Page.ClientScript.IsClientScriptBlockRegistered(uniqueScriptID))
            Page.ClientScript.RegisterStartupScript(typeof(Page), uniqueScriptID, strDisableScript.ToString()); 
Friday, November 6, 2009
Disabling SharePoint TextField control programmatically from a Webpart.
Posted by Rami Reddy Annapu Reddy at 3:12 AM
Subscribe to:
Post Comments (Atom)
0 comments:
Post a Comment