Click here to Skip to main content
16,016,760 members
Articles / Desktop Programming / Windows Forms
Tip/Trick

A method to move rows within a DataTable

Rate me:
Please Sign up or sign in to vote.
4.88/5 (8 votes)
11 Jan 2012CPOL 69.7K   8   7
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, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Canada Canada
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
SuggestionSmaller, more flexible VB solution (based on your code) Pin
Hunter Beanland20-Mar-12 13:45
Hunter Beanland20-Mar-12 13:45 
PraiseRe: Smaller, more flexible VB solution (based on your code) Pin
Hornwood5092-Dec-16 2:54
Hornwood5092-Dec-16 2:54 
GeneralRe: Smaller, more flexible VB solution (based on your code) Pin
Hedlund Automation27-Aug-23 9:38
Hedlund Automation27-Aug-23 9:38 
GeneralYou (they) must be doing something wrong Pin
PIEBALDconsult11-Jan-12 5:58
mvePIEBALDconsult11-Jan-12 5:58 
That shouldn't be necessary. Ideally you would sort the data the way you want with the query. Otherwise use the DataTable.DefaultView (or another DataView) .Sort property.
QuestionWhat issue(s) are you trying to resolve? Pin
spoodygoon11-Jan-12 3:57
spoodygoon11-Jan-12 3:57 
AnswerRe: What issue(s) are you trying to resolve? Pin
agent15412-Jan-12 4:19
agent15412-Jan-12 4:19 
GeneralRe: What issue(s) are you trying to resolve? Pin
spoodygoon16-Jan-12 2:33
spoodygoon16-Jan-12 2:33 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.