Wednesday, February 27, 2013

DNN Manage Button Hidden Behind Another Module

There is one issue I've run into several times with DNN and that is an HTML module covering up another module.  I had this issue with the Dark Knight skin.  An HTML module I had on the ContentPane was covering up the dropdown menu, so I had to make some CSS adjustments to the z-index property.

The issue I have now is slightly different.  I've written several modules that either:
  1. Do not display anything in the View (they work in the background), but you still need to access the Settings to make changes
  2. Do not display anything in the View if there is no data
The problem is if you are in Edit mode and nothing is being displayed, you cannot get to the Manage button because it is 'behind' the Manage button of the module below it.

I've come up with a simple fix for this that I include in my View.ascx file:

<% if(DotNetNuke.Common.Globals.IsEditMode()) { %> 
<div runat="server" id="showIfEditMode" >
   <br />
   <br />
   <br />
<% } %> 

This adds some padding below the module when you are in Edit mode. That way, your Manage button will be visible even when there is nothing to display.

Monday, February 11, 2013

Sorting ArrayList with Linq

This was my first forray into Linq, so I thought I'd post it in case I need it again in the near future.

I needed a list of user to populate a DropDownList.  In DotNetNuke, you can get an ArrayList of all users on the system with a call to: UserController.GetUsers(int PortalID).

The problem is the list is sorted by UserID, so when you open the DDL, you'll see all the users in what seems to be random order.  I wanted the list to be sorted by LastName, FirstName without having to write some sort of IComparer.

This is a great use case for Linq ( I've heard a lot about it, but never used it).

ArrayList a = UserController.GetUsers(0);
var so = from UserInfo s in a orderby s.LastName,s.FirstName select s;
ddlUser.DataSource = so;
ddlUser.DataValueField = "UserID"; // Alias Name from Sproc
ddlUser.DataTextField = "DisplayName";   // Alias name from sproc
ddlUser.Items.Insert(0, new ListItem("Select One", "0")); // Adds items to DDL

If you are using a custom object (ie UserInfo), then you must explicitly declare the type.
When using LINQ to query non-generic IEnumerable collections such as ArrayList, you must explicitly declare the type of the range variable to reflect the specific type of the objects in the collection.