डेटाटेबल कॉलम ऑर्डर कैसे बदलें


90

सी # में डेटाेबल कॉलम ऑर्डर कैसे बदलें।

उदाहरण:

हूँ बनाया sql तालिका प्रकार आदेश Qty, Unit, Id है, लेकिन प्रोग्राम में DataTable क्रम Id, Qty, Unit है। कोड के पीछे सीधे DataTable को sql टेबल टाइप में पास करें ताकि टेबल ऑर्डर अलग हो।

DataTable columns are: `Id,Qty,Unit.`  I want this to be: `Qty,Unit,Id` 

कृपया सहायता कीजिए


1
क्या आप बता सकते हैं कि आप कॉलम ऑर्डर क्यों बदलना चाहते हैं?
केबोक सेप

मैं बनाया गया है sql तालिका प्रकार क्रम है, Qty,Unit,Id लेकिन कार्यक्रम में DataTable आदेश है Id,Qty,Unit। कोड के पीछे सीधे DataTable को sql टेबल टाइप पास करना है ताकि टेबल ऑर्डर अलग-अलग हो। क्यों पूछा जाता है कि "कॉलम ऑर्डर कैसे बदला जाए?"
व्यासदेव मेलाथ

6
ओपी पहले से ही जवाब दे दें।
क्रिश्चियन

जवाबों:


231

DataColumn.SetOrdinal पद्धति का उपयोग करने का प्रयास करें । उदाहरण के लिए:

dataTable.Columns["Qty"].SetOrdinal(0);
dataTable.Columns["Unit"].SetOrdinal(1); 

अद्यतन: इस उत्तर को मेरी अपेक्षा से अधिक ध्यान मिला। भ्रम से बचने के लिए और उपयोग करने में आसान बनाने के लिए मैंने DataTable में कॉलम ऑर्डर करने के लिए एक एक्सटेंशन विधि बनाने का निर्णय लिया:

विस्तार विधि:

public static class DataTableExtensions
{
    public static void SetColumnsOrder(this DataTable table, params String[] columnNames)
    {
        int columnIndex = 0;
        foreach(var columnName in columnNames)
        {
            table.Columns[columnName].SetOrdinal(columnIndex);
            columnIndex++;
        }
    }
}

उपयोग:

table.SetColumnsOrder("Qty", "Unit", "Id");

या

table.SetColumnsOrder(new string[]{"Qty", "Unit", "Id"});

जैसा कि आपने बताया, तालिका संरचना केवल बदल गई । मैं Qty,Id,Unit इस तरह चाहता हूं Qty,Unit,Id
व्यासदेव मेलादथ

Ofc, आपको अंतिम को छोड़कर सभी स्तंभों के लिए इस विधि का उपयोग करना चाहिए।
डिफ़ॉल्ट लोकेल

4
बेहतर विधि शरीर: var colIndex = 0; foreach (कॉलम में नाम colName) तालिका। कॉलम में [colName]। सेटऑर्डिनल (colIndex ++);
जोएलफैन

@JoelFan मैंने अपना उत्तर अपडेट कर दिया है, धन्यवाद! आपका कोड निश्चित रूप से क्लीनर दिखता है।
डिफ़ॉल्ट लोकेल

1
बहुत उपयोगी, tnx।
जोनाथन

6

यह "डिफ़ॉल्ट लोकेल" के उत्तर पर आधारित है, लेकिन यह अध्यादेश स्थापित करने से पहले अमान्य कॉलम नामों को हटा देगा। ऐसा इसलिए है क्योंकि यदि आप गलती से एक अमान्य कॉलम नाम भेजते हैं तो यह विफल हो जाएगा और यदि आप इसे विफल होने से रोकने के लिए एक चेक लगाते हैं तो सूचकांक गलत होगा क्योंकि यह उन सूचकांकों को छोड़ देगा जहां कोई अमान्य स्तंभ नाम पारित किया गया था।

public static class DataTableExtensions
{
    /// <summary>
    /// SetOrdinal of DataTable columns based on the index of the columnNames array. Removes invalid column names first.
    /// </summary>
    /// <param name="table"></param>
    /// <param name="columnNames"></param>
    /// <remarks> http://stackoverflow.com/questions/3757997/how-to-change-datatable-colums-order</remarks>
    public static void SetColumnsOrder(this DataTable dtbl, params String[] columnNames)
    {
        List<string> listColNames = columnNames.ToList();

        //Remove invalid column names.
        foreach (string colName in columnNames)
        {
            if (!dtbl.Columns.Contains(colName))
            {
                listColNames.Remove(colName);
            }
        }

        foreach (string colName in listColNames)
        {
            dtbl.Columns[colName].SetOrdinal(listColNames.IndexOf(colName));
        }
}

2

मुझे पता है कि यह वास्तव में एक पुराना सवाल है .. और ऐसा प्रतीत होता है कि इसका उत्तर दिया गया था .. लेकिन मैं एक ही प्रश्न के साथ यहाँ आया था, लेकिन सवाल का एक अलग कारण है, और इसलिए थोड़ा अलग जवाब मेरे लिए काम करता है। मेरे पास एक अच्छा पुन: प्रयोज्य सामान्य डेटाट्रेडव्यू है जो इसे आपूर्ति किए गए डेटा स्रोत को लेता है और बस कॉलम को उनके डिफ़ॉल्ट क्रम में प्रदर्शित करता है। मैं डिज़ाइनर में डेटासेट के टैब्लेडेप्टर स्तर पर उपनाम और स्तंभ क्रम और चयन रखता हूं। हालाँकि कॉलम के चुनिंदा क्वेरी क्रम को बदलने से कॉलम को डेटासेट के माध्यम से वापस लाने का असर नहीं पड़ता है। मुझे डिज़ाइनर में ऐसा करने का एकमात्र तरीका मिला है, टैब्लेडस्केप के भीतर चुने गए सभी कॉलमों को निकालना है, उन्हें वापस उसी क्रम में जोड़ना जिससे आप उन्हें चयनित करना चाहते हैं।


1

यदि आपके पास 2-3 से अधिक कॉलम हैं, SetOrdinalतो जाने का रास्ता नहीं है। DataView का ToTableतरीका कॉलम नामों के पैरामीटर सरणी को स्वीकार करता है। वहां अपने कॉलम ऑर्डर करें:

DataView dataView = dataTable.DefaultView;
dataTable = dataView.ToTable(true, "Qty", "Unit", "Id");

0

हम कॉलम इंडेक्स को बदलने के लिए इस पद्धति का उपयोग कर सकते हैं, लेकिन सभी कॉलमों पर लागू होना चाहिए यदि दो से अधिक कॉलम हैं अन्यथा यह डेटा टेबल से सभी इम्प्रूवर मान दिखाएगा ........... ........


-3

कुछ शर्त या चेक बॉक्स के आधार पर डेटा तालिका को फिर से ऑर्डर करना। PFB: -

 var tableResult= $('#exampleTable').DataTable();

    var $tr = $(this).closest('tr');
    if ($("#chkBoxId").prop("checked")) 
                    {
                        // re-draw table shorting based on condition
                        tableResult.row($tr).invalidate().order([colindx, 'asc']).draw();
                    }
                    else {
                        tableResult.row($tr).invalidate().order([colindx, "asc"]).draw();
                    }

कृपया प्रश्न को ध्यान से पढ़ें। उपरोक्त क्वेरी c # के लिए नहीं jquery के लिए है
अहमद मुख्तार

1
न केवल यह उत्तर गलत भाषा के लिए है, सवाल स्तंभों को क्रमबद्ध नहीं करने के लिए था। आप इस उत्तर पर कैसे पहुंचे, इसके स्वीकृत उत्तर के बाद 8 साल से अधिक अकेले रहने दें। क्यों?
jreed121
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.