Hide Table of Contents

Sort Table Example (C#)

This example shows how to sort bill of materials, hole, general, and weldment cut list tables.

// Preconditions:
// 1. Open a drawing with one of the following tables:
//    * General
//    * Hole chart
//    * Weldment cut list
//    * Bill of materials parts-only table that
//      contains four columns: Item No, Part Number, Description, and Qty.
// 2. Click the move-table icon in the upper-left corner
//    of the table in the view.
//    The PropertyManager opens on the table.
// 3. If the table is a BOM table, ensure that
//    PropertyManager > Item Numbers > Follow assembly order is not selected.
// Postconditions:  
// 1. Inspect the Immediate Window.
// 2. The tables are sorted as follows:
//    * If it is a BOM table:
//      * Primary sort is on column three (Qty).
//      * Secondary sort is on column one (Part Number).
//      * There is no tertiary sort.
//      * All column sorts are ascending.
//      * Rows are sorted into categories in the following order:
//          1. Parts
//          2. User-defined
//    * If it is a general table, the sort is descending on the first column.
//    * If it is a hole table, the sort is ascending on the Tag column.
//    * If it is a weldment cut list table, the sort is descending on
//       the third column.
// --------------------------------------------------------------------------

using SolidWorks.Interop.sldworks;
using SolidWorks.Interop.swconst;
using System;
using System.Diagnostics;
namespace Macro1.csproj
public partial class SolidWorksMacro
IModelDoc2 swModDoc = null;
ITableAnnotation swTable = null;
public void Main()

public void GetSelTable()
            swModDoc = (
ISelectionMgr swSM = null;
            swSM = (
            swTable = (
ITableAnnotation)swSM.GetSelectedObject6(1, -1);

public void SortSelTable()
if (swTable != null)
swTableAnnotationType_e tableType = (swTableAnnotationType_e)swTable.Type;
bool status = false;
switch (tableType)
case swTableAnnotationType_e.swTableAnnotation_General:
                        status = SortGeneralTable();
case swTableAnnotationType_e.swTableAnnotation_HoleChart:
                        status = SortHoleChartTable();
case swTableAnnotationType_e.swTableAnnotation_WeldmentCutList:
                        status = SortWeldmentCutlistTable();
case swTableAnnotationType_e.swTableAnnotation_BillOfMaterials:
                        status = SortBOMTable();
Debug.Print("Unspecified table type selected.");

public bool SortGeneralTable()
Debug.Print("Table type selected : swTableAnnotation_General");
IGeneralTableAnnotation swSpecTable = (IGeneralTableAnnotation)swTable;
bool status =  swSpecTable.Sort(0, false);//sort descending
            return status;

public bool SortHoleChartTable()
Debug.Print("Table type selected : swTableAnnotation_HoleChart");
IHoleTableAnnotation swSpecTable = (IHoleTableAnnotation)swTable;
bool status = swSpecTable.Sort(0, true );//sort ascending
            return status;

public bool SortWeldmentCutlistTable()
Debug.Print("Table type selected : swTableAnnotation_WeldmentCutList");
IWeldmentCutListAnnotation swSpecTable = (IWeldmentCutListAnnotation)swTable;
bool status = swSpecTable.Sort(2, false);//sort descending
            return status;

public bool SortBOMTable()
Debug.Print("Table type selected : swTableAnnotation_BillOfMaterials");
IBomTableAnnotation swSpecTable = (IBomTableAnnotation)swTable;
BomTableSortData swSortData = swSpecTable.GetBomTableSortData();
// Specify the sort order indexes for three columns in the table
            // Specify the direction of sort for the three sort order indexes
            swSortData.set_ColumnIndex(0, 3); // primary sort
true); // sort ascending
            swSortData.set_ColumnIndex(1, 1); // secondary sort
true); // sort ascending
            swSortData.set_ColumnIndex(2, -1); // no tertiary sort
int pos1 = swSortData.get_ColumnIndex(0);
Debug.Print("Column for primary sort is " + pos1); // should be 3
            int pos2 = swSortData.get_ColumnIndex(1);
Debug.Print("Column for secondary sort is " + pos2); // should be 1
            int pos3 = swSortData.get_ColumnIndex(2);
Debug.Print("Column for tertiary sort is " + pos3); // should be -1

            int[] listGrpArray = null;
object grpArray = null;
            grpArray = listGrpArray;
bool bWantGrp = true;

// Sort rows into part and user-defined categories
                listGrpArray = new int[3];
                listGrpArray[0] = (
                listGrpArray[1] = (
                listGrpArray[2] = (
                grpArray = listGrpArray;
            swSortData.ItemGroups = grpArray;
// After sorting, do not re-number the items
            swSortData.DoNotChangeItemNumber = true;

bool status = swSpecTable.Sort(swSortData);
Debug.Print("BOM table sorted: " + status);
return status;

public SldWorks swApp;

Provide feedback on this topic

SOLIDWORKS welcomes your feedback concerning the presentation, accuracy, and thoroughness of the documentation. Use the form below to send your comments and suggestions about this topic directly to our documentation team. The documentation team cannot answer technical support questions. Click here for information about technical support.

* Required

Subject:   Feedback on Help Topics
Page:   Sort Table Example (C#)
*   I acknowledge I have read and I hereby accept the privacy policy under which my Personal Data will be used by Dassault Systèmes

Print Topic

Select the scope of content to print:


We have detected you are using a browser version older than Internet Explorer 7. For optimized display, we suggest upgrading your browser to Internet Explorer 7 or newer.

 Never show this message again

Web Help Content Version: API Help (English only) 2012 SP05

To disable Web help from within SOLIDWORKS and use local help instead, click Help > Use SOLIDWORKS Web Help.

To report problems encountered with the Web help interface and search, contact your local support representative. To provide feedback on individual help topics, use the “Feedback on this topic” link on the individual topic page.