Wednesday, January 19, 2011

Creating List Using List Definition Programatically



Let’s have a look at how we can create custom list by using our own List Definition
There is <ListTemplate> element using which we can easily create our own list definition.          Andrew Connel has explained this very well in this post
But this is something different approach I wanted to use with our own list definitions
After creating List Definition I didn’t want to add List Instance to the solution because if we do so, then it creates a list with based definition automatically when feature gets activated.
I wanted to have a control over creation of this list which will be based on our custom List Definition. Which puzzled me..
Then I found a way to achieve this by using object model.. I don’t know yet If there are multiple ways to do this but this one was perfect choice for me and worked very well J
When we create a List Definition then we have a feature which provisions list definition
Note that GUID used here in code is Feature Id of the feature which provisions the list definition.
Also : please take into consideration that there are some methods in server object model available for creating a list using list templates directly , but this was something different than list templates, so this approach was preferred , because List Templates are stored into the content database while list definitions resides on actual file system of the server


try
{
  SPList list = null;
  using (SPSite site = new SPSite("http://yoursite/"))
  {
     using (SPWeb web = site.RootWeb)
     {
      //List Will be Created Based on this ListDefinition
- OOB Custom List Definition
      //00BFEA71-DE22-43B2-A848-C05709900100

        foreach (SPList _list in web.Lists)
        {
          if (_list.Title.Equals("TestList"))
          {
              list = _list;
          }
        }

        if (list == null)
        {
         web.AllowUnsafeUpdates = true;
         Guid listID = web.Lists.Add("TestList", //List Title
                      "This is Test List",      //List Description
                      "Lists/TestList",         //List Url
                      "00BFEA71-DE22-43B2-A848-C05709900100", //Feature Id of List definition Provisioning Feature – CustomList Feature Id
                      100,                     //List Template Type
                     "101");      //Document Template Type .. 101 is for None

           web.Update();
           web.AllowUnsafeUpdates = false;
                           
         }
        }


     }
    }
    catch (Exception ex)
    {
      
    }

this is the way to do this and works fine :)
I hope some one finds this useful..

2 comments:

  1. Thanks, worked great...one small issue is using 100 for the list template type didn't work for me. I had to look in the Elements.xml file for the list definition and use the "Type" number from there. Thanks!

    ReplyDelete
  2. Glad that it helped you :)
    Id 100 was just for example, solution depends on your list template id.

    ReplyDelete