Code Snippet to remove duplicate workflow associations from a content type


   1:              using (SPSite site = new SPSite("http://ms9:105"))
   2:              {
   3:                  using (SPWeb web = site.OpenWeb())
   4:                  {
   5:                      SPList list = web.Lists["Shared Documents"];
   6:                      
   7:                      foreach(SPContentType con in list.ContentTypes)
   8:                      {
   9:                          if (con.Name == "Document")
  10:                          {
  11:                              SPWorkflowAssociationCollection assocCol = con.WorkflowAssociations;
  12:                              bool App = false;
  13:                              bool Feed = false;
  14:                              bool Sig = false;
  15:                              for (int i = 0; i < assocCol.Count; i++)
  16:                              {
  17:                                  if (assocCol[i].Name == "Approval" && !App)
  18:                                  {
  19:                                      list.RemoveWorkflowAssociation(assocCol[i]);
  20:                                      App = true;
  21:                                  }
  22:                                  if (assocCol[i].Name == "Collect Feedback" && !Feed)
  23:                                  {
  24:                                      list.RemoveWorkflowAssociation(assocCol[i]);
  25:                                      Feed = true;
  26:                                  }
  27:                                  if (assocCol[i].Name == "Collect Signatures" && !Sig)
  28:                                  {
  29:                                      list.RemoveWorkflowAssociation(assocCol[i]);
  30:                                      Sig = true;
  31:                                  }
  32:                              }
  33:                          }
  34:                      }
  35:                  }
  36:              }
  37:   
  38:              MessageBox.Show("Done!");

Above snippet looks for the specific workflow name but if we want to remove based on the workflow type then the code would be like following.

 

   1:  using (SPSite site = new SPSite("http://ms10:500/sites/test"))
   2:              {
   3:                  using (SPWeb web = site.OpenWeb())
   4:                  {
   5:                      SPList list = web.Lists["Shared Documents"];
   6:                      
   7:                      foreach(SPContentType con in list.ContentTypes)
   8:                      {
   9:                          if (con.Name == "Document")
  10:                          {
  11:                              SPWorkflowAssociationCollection assocCol = con.WorkflowAssociations;
  12:                              SPWorkflowAssociation wrkflow = null;
  13:                              bool App = false;
  14:                              bool Feed = false;
  15:                              bool Sig = false;
  16:                              bool flag = false;
  17:                              for (int i = 0; i < assocCol.Count; i++)
  18:                              {
  19:                                  flag = false;
  20:                                  if (assocCol[i].BaseTemplate.Name == "Approval" && !App)
  21:                                  {
  22:                                      list.RemoveWorkflowAssociation(assocCol[i]);
  23:                                      App = true;
  24:                                      flag = true;
  25:                                  }
  26:                                  if (assocCol[i].BaseTemplate.Name == "Collect Feedback" && !Feed)
  27:                                  {
  28:                                      list.RemoveWorkflowAssociation(assocCol[i]);
  29:                                      Feed = true;
  30:                                      flag = true;
  31:                                  }
  32:                                  if (assocCol[i].BaseTemplate.Name == "Collect Signatures" && !Sig)
  33:                                  {
  34:                                      list.RemoveWorkflowAssociation(assocCol[i]);
  35:                                      Sig = true;
  36:                                      flag = true;
  37:                                  }
  38:   
  39:                                  if (!flag)
  40:                                  {
  41:                                      wrkflow = con.WorkflowAssociations[i];
  42:                                      wrkflow.Enabled = true;
  43:                                      list.UpdateWorkflowAssociation(wrkflow);
  44:                                      wrkflow = null;
  45:                                  }
  46:                              }
  47:                          }
  48:                      }
  49:                  }
  50:              }
  51:   
  52:              MessageBox.Show("Done!");

 

image

:: Please note that I would have just uploaded my initial code and you might want to consider proper optimization of the code and disposal of objects properly. I might not have updated the latest code here.

Comments (0)

Skip to main content