วิธีเปลี่ยนลำดับคอลัมน์ DataTable


92

วิธีเปลี่ยนลำดับคอลัมน์ Datatable ใน c #

ตัวอย่าง:

ฉันสร้างคำสั่งประเภทตาราง sql คือ Qty, Unit, Id แต่ในโปรแกรมคำสั่ง DataTable คือ Id, Qty, Unit ในโค้ด Behind am ส่ง DataTable ไปยังตาราง sql โดยตรงดังนั้นลำดับตารางจึงแตกต่างกัน

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

กรุณาช่วย


1
คุณช่วยอธิบายได้ไหมว่าทำไมคุณถึงต้องการเปลี่ยนลำดับคอลัมน์
KBoek

กำลังสร้างขึ้นเพื่อพิมพ์ตาราง SQL เป็นQty,Unit,Id แต่ในโปรแกรมเพื่อ DataTable Id,Qty,Unitคือ ในโค้ด Behind am ส่ง DataTable ไปยังตาราง sql โดยตรงดังนั้นลำดับตารางจึงแตกต่างกันนั่นคือเหตุผลที่ถามว่า "จะเปลี่ยนลำดับคอลัมน์ได้อย่างไร"
Vyasdev Meledath

6
แค่ตอบ OP ก็แล้ว
Christian

คำตอบ:


233

ลองใช้เมธอดDataColumn.SetOrdinal ตัวอย่างเช่น:

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

UPDATE:คำตอบนี้ได้รับความสนใจมากกว่าที่ฉันคาดไว้ เพื่อหลีกเลี่ยงความสับสนและทำให้ใช้งานได้ง่ายขึ้นฉันตัดสินใจสร้างวิธีการขยายสำหรับการสั่งซื้อคอลัมน์ใน 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 only.I Qty,Unit,Idต้องการเช่นนี้
Vyasdev Meledath

Ofc คุณควรใช้วิธีนี้กับคอลัมน์ทั้งหมดยกเว้นคอลัมน์สุดท้าย
ภาษาเริ่มต้น

4
ร่างกายวิธีการที่ดีกว่า: var colIndex = 0; foreach (var colName ใน columnNames) table.Columns [colName ].SetOrdinal (colIndex ++);
JoelFan

@JoelFan ฉันได้อัปเดตคำตอบแล้วขอบคุณ! รหัสของคุณดูสะอาดขึ้นแน่นอน
ภาษาเริ่มต้น

1
มีประโยชน์มาก tnx
jonathana

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

ฉันรู้ว่านี่เป็นคำถามเก่าจริงๆ .. และดูเหมือนว่ามันจะได้รับคำตอบ .. แต่ฉันมาที่นี่ด้วยคำถามเดียวกัน แต่มีเหตุผลที่แตกต่างกันสำหรับคำถามและคำตอบที่แตกต่างกันเล็กน้อยก็ใช้ได้ผลกับฉัน ฉันมี datagridview ทั่วไปที่สามารถนำกลับมาใช้ใหม่ได้ซึ่งใช้แหล่งข้อมูลที่ให้มาและแสดงคอลัมน์ตามลำดับเริ่มต้น ฉันใส่นามแฝงและลำดับคอลัมน์และการเลือกที่ระดับ tableadapter ของชุดข้อมูลในตัวออกแบบ อย่างไรก็ตามการเปลี่ยนลำดับการสืบค้นเลือกของคอลัมน์ดูเหมือนจะไม่ส่งผลต่อคอลัมน์ที่ส่งคืนผ่านชุดข้อมูล ฉันพบวิธีเดียวที่จะทำได้ในตัวออกแบบคือการลบคอลัมน์ทั้งหมดที่เลือกภายใน tableadapter และเพิ่มกลับเข้าไปในลำดับที่คุณต้องการให้เลือก


1

หากคุณมีมากกว่า 2-3 คอลัมน์SetOrdinalคือไม่ได้วิธีที่จะไป ToTableเมธอดของ DataView ยอมรับอาร์เรย์พารามิเตอร์ของชื่อคอลัมน์ สั่งซื้อคอลัมน์ของคุณที่นั่น:

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
Ahmad Mukhtar

1
คำตอบนี้ไม่เพียง แต่เป็นภาษาที่ไม่ถูกต้องเท่านั้นคำถามนี้มีไว้สำหรับการจัดเรียงคอลัมน์ที่ไม่เรียงแถว คุณมาถึงคำตอบนี้ได้อย่างไรนับประสาอะไรกับคำตอบที่ยอมรับมานานกว่า 8 ปี ทำไม?
jreed121
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.