Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles
(untagged)

A method to move rows within a DataTable

0.00/5 (No votes)
11 Jan 2012 1  
A method to move rows within a DataTable
This would be my first time posting something of this sort. I apologize if it is not in the right (or most appropriate) area.

I created this simple inherited class to add a function for moving a row up or down within a DataTable. Sometimes it is desired to do so, and I've seen a few people online looking for a way to do it.

using System.Data;

namespace SNS.Tools
{
    public enum SNSDataTableMoveRow
    {
        Up,
        Down
    }

    public class SNSDataTable : System.Data.DataTable
    {
        public SNSDataTable()
            : base()
        {
        }

        public SNSDataTable(string tableName)
            : base(tableName)
        {
        }

        public SNSDataTable(string tableName, string tableNamespace)
            : base(tableName, tableNamespace)
        {
        }

        public SNSDataTable(System.Runtime.Serialization.SerializationInfo info,
            System.Runtime.Serialization.StreamingContext context)
            : base(info, context)
        {
        }

        /// <summary>
        /// A custom method used to move a row up or down in a DataTable
        /// </summary>
        /// <param name="row">A DataRow which is a member of this DataTable.</param>
        /// <param name="direction">Up or Down.</param>
        /// <returns>The new row index after the move.</returns>
        public int MoveRow(DataRow row, SNSDataTableMoveRow direction)
        {
            DataRow oldRow = row;
            DataRow newRow = this.NewRow();

            newRow.ItemArray = oldRow.ItemArray;

            int oldRowIndex = this.Rows.IndexOf(row);

            if (direction == SNSDataTableMoveRow.Down)
            {
                int newRowIndex = oldRowIndex + 1;

                if (oldRowIndex < (this.Rows.Count))
                {
                    this.Rows.Remove(oldRow);
                    this.Rows.InsertAt(newRow, newRowIndex);
                    return this.Rows.IndexOf(newRow);
                }
            }

            if (direction == SNSDataTableMoveRow.Up)
            {
                int newRowIndex = oldRowIndex - 1;

                if (oldRowIndex > 0)
                {
                    this.Rows.Remove(oldRow);
                    this.Rows.InsertAt(newRow, newRowIndex);
                    return this.Rows.IndexOf(newRow);
                }
            }

            return 0;
        }
    }
}

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here