Поделиться через


Customize drop-down fields for SPLists

All of us love to use lookup columns. A lot.
But what happens when you add two lookup fields to a custom list, one of them pointing to a source list with say 35 items, and the other one pointing to a source list with 5 items? We noticed that the drop-downs in the NewForm.aspx and EditForm.aspx pages are not rendered in the same way ...

The cause? Check the Microsoft.SharePoint.WebControls.LookupField.CreateChildControls() inside Microsoft.SharePoint.dll:

 if ((((this.DataSource != null) && (this.DataSource.Count > 20)) && (!base.InDesign && SPUtility.IsIE55Up(this.Page.Request))) && !SPUtility.IsAccessibilityMode(this.Page.Request)) { ... }

Interesting, isn't it? But how is the CSS styling defined for this type of fields?
Well, you'll find the answer inside \12\TEMPLATE\LAYOUTS\1033\STYLES\CORE.CSS:

 .ms-lookuptypeintextbox
{
width:20em;
vertical-align:middle;
}

So what can we do to have some dynamically expanding drop-downs for these fields? You could try something as follows, inside the master page used by your NewForm.aspx and EditForm.aspx pages:

 </BODY>
<!-- customization start -->
<SCRIPT>
function findAndEdit() {
  var nodeList = document.getElementsByTagName("input");
  for (var i=0; i<nodeList.length; i++)
  if (nodeList[i].className == "ms-lookuptypeintextbox") {
    var choices = nodeList[i].getAttribute("choices").split("|");
    var maxLength = 1;
    for (var j=1; j<choices.length; j++)
      if (choices[j].length > maxLength)
        maxLength = choices[j].length;
    nodeList[i].style.width = (maxLength*7) + "px";
  } }
findAndEdit();
</SCRIPT>
<!-- customization end -->
</HTML>