डेटा तालिका में पंक्तियों को क्रमबद्ध करना


146

हमारे पास दो कॉलम हैं DataTable, जैसे:

COL1   COL2
Abc    5
Def    8
Ghi    3

हम इसे घटते क्रम के datatableआधार पर क्रमबद्ध करने का प्रयास कर रहे हैं COL2

COL1            COL2
ghi             8
abc             4
def             3
jkl             1

हमने यह कोशिश की:

ft.DefaultView.Sort = "COL2 desc";
ft = ft.DefaultView.ToTable(true);

लेकिन, एक का उपयोग किए बिना DataView, हम DataTableखुद को सॉर्ट करना चाहते हैं , नहीं DataView

जवाबों:


355

मुझे डर है कि आप आसानी से एक DataTable के इन-प्लेस सॉर्ट नहीं कर सकते हैं जैसे यह लगता है कि आप करना चाहते हैं।

आप क्या कर सकते हैं एक DataView से एक नया DataTable बनाएं जो आप अपने मूल DataTable से बनाते हैं। DataView पर जो भी प्रकार और / या फ़िल्टर चाहते हैं उसे लागू करें और फिर DataView.ToTable पद्धति का उपयोग करके DataView से एक नया DataTable बनाएँ :

   DataView dv = ft.DefaultView;
   dv.Sort = "occr desc";
   DataTable sortedDT = dv.ToTable();

मैं मूल्य मान के संदर्भ में आरोही मान चाहता हूं जो दशमलव है। इसे कैसे करना है?
रंजीथ कुमार नागिरी

यह दृष्टिकोण ठीक लगता है। लेकिन क्या इसे करने का कोई सीधा तरीका नहीं है? उनके पास DataTable.sort ("by") क्यों नहीं है?
भाप

28
धन्यवाद। यह ध्यान देने योग्य है कि, "occr desc" यहाँ, "occr" कॉलम नाम है, "desc" का अर्थ है "अवरोही"।
user1032613

22
यह मेरे लिए dataTable.DefaultView.Sort = "Col1, Col2, Col3" में काम करता है। थोड़ा साफ कोड।
साईं

7
@साई की तरह, आप DataTable.DefaultView.Sort को सीधे संशोधित कर सकते हैं। दृश्य को "ब्रेक आउट" करने और एक तालिका को फिर से बनाने की कोई आवश्यकता नहीं है।
जॉनी

40

यह आपकी मदद करेगा ...

DataTable dt = new DataTable();         
dt.DefaultView.Sort = "Column_name desc";
dt = dt.DefaultView.ToTable();

बड़े मन वाले ऐसा सोचते हैं। मैं @ JayR's पढ़ने के बाद उसी समाधान को पोस्ट करने वाला था।
ड्रू चैपिन

Column_name cuz के लिए मैं उलझन में था कि Jay Riggs के हल में क्या लिखा था :)
Thameem

अद्भुत और आसान उपाय :)
एम। फवाद सूरश

25

इसका सरल उपयोग है। चयन समारोह।

DataRow[] foundRows=table.Select("Date = '1/31/1979' or OrderID = 2", "CompanyName ASC");
DataTable dt = foundRows.CopyToDataTable();

और हो गया ...... हैप्पी कोडिंग


ध्यान दें कि यदि, ओपी की तरह, आप केवल इस की छंटाई पहलू में रुचि रखने वाले और परिणामों को फ़िल्टर करने नहीं चाहते हो रहे हैं, आप इसे इस तरह निर्दिष्ट कर सकते हैं: Select("", "CompanyName ASC")
तवाब वाकिल

20

शायद निम्नलिखित मदद कर सकता है:

DataRow[] dataRows = table.Select().OrderBy(u => u["EmailId"]).ToArray();

यहाँ, आप अन्य लैम्ब्डा अभिव्यक्ति प्रश्नों का भी उपयोग कर सकते हैं।


14

क्या आपने Select(filterExpression, sortOrder)DataTable पर विधि का उपयोग करने की कोशिश की ? एक उदाहरण के लिए यहाँ देखें । ध्यान दें कि यह विधि उस स्थान पर डेटा तालिका को सॉर्ट नहीं करेगी, यदि आप जो देख रहे हैं, वह है, लेकिन यह डेटा दृश्य का उपयोग किए बिना पंक्तियों की एक क्रमबद्ध सरणी लौटाएगा।


13

या, यदि आप एक का उपयोग कर सकते हैं, तो आप DataGridViewकॉल कर सकते हैं Sort(column, direction):

namespace Sorter
{
    using System;
    using System.ComponentModel;
    using System.Windows.Forms;

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            this.dataGridView1.Rows.Add("Abc", 5);
            this.dataGridView1.Rows.Add("Def", 8);
            this.dataGridView1.Rows.Add("Ghi", 3);
            this.dataGridView1.Sort(this.dataGridView1.Columns[1], 
                                    ListSortDirection.Ascending);
        }
    }
}

जो आपको वांछित परिणाम देगा:

डिबगर दृश्य


@vidyasagar कोई समस्या नहीं। इसके अलावा, भविष्य के संदर्भ के लिए, यदि कोई उत्तर मूल्यवान है, तो आपको इसे वोट करना चाहिए (उदाहरण के लिए, मेरा?)। और अगर एक उत्तर "द" उत्तर है, तो आपको इसे उत्तर (उदाहरण, जे के) के रूप में चिह्नित करना चाहिए।
गुस्तावो मोरी

11
 table.DefaultView.Sort = "[occr] DESC";

विद्या desc ऑर्डर में अपने टेबल को सॉर्ट करना चाहती हैं। जो ऊपर सरल कोड है। यह वही करता है जो जे रिग्स (स्वीकृत उत्तर) ने दिखाया था सिवाय इसके कि यह कोड की एक पंक्ति में किया जाता है।
ivg

2
सुझाव पोस्ट को बेहतर बनाने के लिए था; प्रतिक्रिया में कोड के बारे में जानकारी है कि भविष्य में जगह है। इसके लिए यह किसी को पोस्ट को अपवॉट करने या यहां तक ​​कि उत्तर के रूप में चयन करने का मौका देता है।
04megaMan

5

सॉर्ट डेटा के लिए 2 तरीका है

1) केवल डेटा छांटना और ग्रिड में भरना:

DataGridView datagridview1 = new DataGridView(); // for show data
DataTable dt1 = new DataTable(); // have data
DataTable dt2 = new DataTable(); // temp data table
DataRow[] dra = dt1.Select("", "ID DESC");
if (dra.Length > 0)
    dt2 = dra.CopyToDataTable();
datagridview1.DataSource = dt2;

2) सॉर्ट डिफ़ॉल्ट दृश्य जो ग्रिड कॉलम हेडर के साथ सॉर्ट करने जैसा है:

DataGridView datagridview1 = new DataGridView(); // for show data
DataTable dt1 = new DataTable(); // have data
dt1.DefaultView.Sort = "ID DESC";
datagridview1.DataSource = dt1;

1
जवाब के लिए धन्यवाद। आपके रास्ते # 1 ने मेरे मामले में मदद की: मुझे एक बहुत ही विशेष IComparer मिला, इसलिए इसे इस्तेमाल करने के लिए मैंने कुछ इस तरह किया:DataRow[] rows = dt.Rows.Cast<DataRow>().OrderBy(row => row.Field<string>("FIELD_NAME"), MyCustomComparer.Instance).ToArray();
अलेक्सी

4

यह पता चला है कि एक विशेष मामला है जहां यह हासिल किया जा सकता है। ट्रिक जब डेटाटेबल का निर्माण कर रही है, तो एक सूची में सभी पंक्तियों को इकट्ठा करें, उन्हें सॉर्ट करें, फिर उन्हें जोड़ें। यह मामला अभी यहां सामने आया।


3

//आशा है कि यह आपकी मदद करेगा..

        DataTable table = new DataTable();
        //DataRow[] rowArray = dataTable.Select();
        table = dataTable.Clone();
        for (int i = dataTable.Rows.Count - 1; i >= 0; i--)
        {
            table.ImportRow(dataTable.Rows[i]);
        }
        return table;

1

टी एल; डॉ

tableObject.Select(queryExpression, sortOrderExpression)क्रमबद्ध तरीके से डेटा का चयन करने के लिए उपयोग करें

पूरा उदाहरण

पूरा काम करने का उदाहरण - एक कंसोल एप्लिकेशन में परीक्षण किया जा सकता है :

    using System;
    using System.Data;

    namespace A
    {
        class Program
        {
            static void Main(string[] args)
            {
                DataTable table = new DataTable("Orders");
                table.Columns.Add("OrderID", typeof(Int32));
                table.Columns.Add("OrderQuantity", typeof(Int32));
                table.Columns.Add("CompanyName", typeof(string));
                table.Columns.Add("Date", typeof(DateTime));

                DataRow newRow = table.NewRow();
                newRow["OrderID"] = 1;
                newRow["OrderQuantity"] = 3;
                newRow["CompanyName"] = "NewCompanyName";
                newRow["Date"] = "1979, 1, 31";

                // Add the row to the rows collection.
                table.Rows.Add(newRow);

                DataRow newRow2 = table.NewRow();
                newRow2["OrderID"] = 2;
                newRow2["OrderQuantity"] = 2;
                newRow2["CompanyName"] = "NewCompanyName1";
                table.Rows.Add(newRow2);

                DataRow newRow3 = table.NewRow();
                newRow3["OrderID"] = 3;
                newRow3["OrderQuantity"] = 2;
                newRow3["CompanyName"] = "NewCompanyName2";
                table.Rows.Add(newRow3);

                DataRow[] foundRows;

                Console.WriteLine("Original table's CompanyNames");
                Console.WriteLine("************************************");
                foundRows = table.Select();

                // Print column 0 of each returned row.
                for (int i = 0; i < foundRows.Length; i++)
                    Console.WriteLine(foundRows[i][2]);

                // Presuming the DataTable has a column named Date.
                string expression = "Date = '1/31/1979' or OrderID = 2";
                // string expression = "OrderQuantity = 2 and OrderID = 2";

                // Sort descending by column named CompanyName.
                string sortOrder = "CompanyName ASC";

                Console.WriteLine("\nCompanyNames data for Date = '1/31/1979' or OrderID = 2, sorted CompanyName ASC");
                Console.WriteLine("************************************");
                // Use the Select method to find all rows matching the filter.
                foundRows = table.Select(expression, sortOrder);

                // Print column 0 of each returned row.
                for (int i = 0; i < foundRows.Length; i++)
                    Console.WriteLine(foundRows[i][2]);

                Console.ReadKey();
            }
        }
    }

उत्पादन

उत्पादन


0

इसे इस्तेमाल करे:

DataTable DT = new DataTable();
DataTable sortedDT = DT;
sortedDT.Clear();
foreach (DataRow row in DT.Select("", "DiffTotal desc"))
{
    sortedDT.NewRow();
    sortedDT.Rows.Add(row);
}
DT = sortedDT;

1) आपको नई तालिका बनानी होगी DataTable sortedDT = new DataTable()। 2) आपको उपयोग करने की आवश्यकता है ImportRow(आप अलग-अलग तालिका से पंक्ति नहीं जोड़ सकते हैं)
marbel82
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.