คุณจะปรับขนาดคอลัมน์โดยอัตโนมัติในตัวควบคุม DataGridView ได้อย่างไรและอนุญาตให้ผู้ใช้ปรับขนาดคอลัมน์บนกริดเดียวกันได้อย่างไร


109

ฉันกำลังเติมตัวควบคุม DataGridView บนฟอร์ม Windows (C # 2.0 ไม่ใช่ WPF)

เป้าหมายของฉันคือการแสดงเส้นตารางที่เติมความกว้างที่มีอยู่ทั้งหมดด้วยเซลล์อย่างเรียบร้อยนั่นคือไม่มีพื้นที่ที่ไม่ได้ใช้ (สีเทาเข้ม) ลงทางด้านขวาและปรับขนาดแต่ละคอลัมน์ให้เหมาะสมตามข้อมูลที่มีแต่ยังช่วยให้ผู้ใช้สามารถปรับขนาดคอลัมน์ใดก็ได้ ตามความชอบของพวกเขา

ฉันพยายามที่จะบรรลุสิ่งนี้โดยตั้งค่า AutoSizeMode ของแต่ละคอลัมน์เป็นDataGridViewAutoSizeColumnMode AllCellsยกเว้นคอลัมน์ใดคอลัมน์หนึ่งที่ฉันตั้งค่าเป็นDataGridViewAutoSizeColumnModeกรอกข้อมูลเพื่อให้แน่ใจว่าพื้นที่ทั้งหมดของกริดเต็มไปด้วยข้อมูลอย่างเรียบร้อย (ฉันไม่ทราบว่าเมื่อผู้ใช้พยายามปรับขนาดคอลัมน์นี้คอลัมน์นี้จะกลับมาเป็นขนาดที่ทำให้แน่ใจว่ามีการใช้พื้นที่แนวนอนเสมอ)

อย่างไรก็ตามดังที่ได้กล่าวไปแล้วเมื่อโหลดแล้วฉันต้องการอนุญาตให้ผู้ใช้ปรับขนาดคอลัมน์ให้เหมาะกับความต้องการของตนเอง - ในการตั้งค่า AutoSizeMode เหล่านี้สำหรับแต่ละคอลัมน์ดูเหมือนว่าผู้ใช้จะไม่สามารถปรับขนาดคอลัมน์เหล่านั้นได้

ฉันพยายามไม่ตั้งค่า AutoSizeMode ของคอลัมน์ทั้งหมดที่อนุญาตให้ปรับขนาดได้ แต่ไม่ได้กำหนดขนาดเริ่มต้นตามข้อมูลในเซลล์ ผลลัพธ์เดียวกันนี้เกิดขึ้นเมื่อเปลี่ยน AutoSizeMode ของกริดกลับไปเป็น "Not Set" หลังจากโหลดข้อมูล

มีการตั้งค่าที่ฉันขาดหายไปที่นี่ซึ่งอนุญาตให้ตั้งค่าความกว้างคอลัมน์เริ่มต้นและการปรับขนาดผู้ใช้โดยอัตโนมัติหรือมีเทคนิคอื่นที่ฉันต้องใช้เมื่อเติมข้อมูลตัวควบคุม DataGridView หรือไม่


อย่าตั้งค่าเป็น "ไม่ได้ตั้งค่า" ตั้งค่าเป็น"ไม่มี" ดังนั้นการปรับขนาดใหม่จะไม่ย้อนกลับ - ทดสอบสำหรับ c #, .net2.0
bh_earth0

คำตอบ:


132

เคล็ดลับนี้ใช้ได้กับฉัน:

grd.DataSource = DT;

//set autosize mode
grd.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
grd.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
grd.Columns[2].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;

//datagrid has calculated it's widths so we can store them
for (int i = 0; i <= grd.Columns.Count - 1; i++) {
    //store autosized widths
    int colw = grd.Columns[i].Width;
    //remove autosizing
    grd.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
    //set width to calculated by autosize
    grd.Columns[i].Width = colw;
}

สิ่งที่เกิดขึ้นที่นี่คือคุณตั้งค่าการปรับขนาดอัตโนมัติเป็นโหมดใดก็ตามที่คุณต้องการจากนั้นคอลัมน์ทีละคอลัมน์คุณจะจัดเก็บความกว้างที่ได้รับจากการคำนวณขนาดอัตโนมัติลบการปรับขนาดอัตโนมัติและตั้งค่าความกว้างเป็นค่าที่คุณเก็บไว้ก่อนหน้านี้


1
ฉันใส่รหัสที่คล้ายกันในรูทีนชื่อ AutoResizeColumnWidthsYetAllowUserResizing เรียกว่าหลังจากที่มีการเติมข้อมูลกริดในตอนแรกและหลังจากที่ผู้ใช้แก้ไขข้อมูล (นั่นคือจากเหตุการณ์ CellEndEdit ของกริด)
พัฒนา

5
นี่คือรหัสที่ยอดเยี่ยม จำเป็นต้องใส่ไว้ในเหตุการณ์ "DataGridView1_DataSourceChanged"
user890332

1
สำหรับฉันgrd.Columns(i).Width = grd.Columns(i).Widthแล้วดูเหมือนว่าการทำจะเป็นการหลอกลวง ดูที่นี่ .
Antonio

2
สำหรับ c # ที่คล้ายกัน แต่มีวงเล็บเหลี่ยม dataGridView1.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
barlop

สิ่งนี้อาจมาช้ามาก แต่มีโอกาสหรือทางใดเราสามารถปรับขนาดตามเนื้อหาของแถวใดแถวหนึ่งได้หรือไม่? สมมติว่าขึ้นอยู่กับเนื้อหาของเซลล์ในแถวแรกโดยไม่คำนึงถึงความกว้างของเซลล์ในแถวอื่น ๆ ?
Murtuza Husain

45

บางทีคุณอาจจะโทร

dataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.Fill);

หลังจากตั้งค่าแหล่งข้อมูล มันจะกำหนดความกว้างและอนุญาตให้ปรับขนาด

เพิ่มเติมใน MSDN DataGridView.AutoResizeColumns วิธี (DataGridViewAutoSizeColumnsMode)


2
ฉันไม่แน่ใจว่าทำไมคำตอบนี้ถึงไม่ได้รับความสนใจมากขึ้น สะอาดกว่ามาก แม้ว่าคุณต้องการจับคู่ความกว้างของเนื้อหาเซลล์ DataGridViewAutoSizeColumnsMode AllCells จะทำงานได้ดีขึ้นเล็กน้อย
iwalkbarefoot

31
เมื่อใช้โซลูชันนี้ฉันได้รับข้อผิดพลาดถัดไป: "พารามิเตอร์ autoSizeColumnMode ไม่ถูกต้องสำหรับการดำเนินการนี้ไม่สามารถเป็น NotSet, None หรือ Fill ได้ แต่จำเป็นต้องระบุเกณฑ์การปรับขนาด" . ฉันลงเอยด้วยการใช้dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill นี้
itsho

6
ใช้ DataGridViewAutoSizeColumnMode.Fill ไม่ทำงานเนื่องจากไม่สนใจเนื้อหาของเซลล์เมื่อปรับขนาดคอลัมน์
Stuart Helwig

ฉันใช้วิธีนี้กับDataGridViewAutoSizeColumnsMode.DisplayedCells. นอกจากนี้ในตัวออกแบบฟอร์ม AutoSizeColumnsMode ถูกตั้งค่าเป็นไม่มี ฉันจำเป็นต้องเรียกใช้เมธอดนี้ในตัวจัดการเหตุการณ์ DataBindingComplete ของ DataGridView เพื่อให้แน่ใจว่าขนาด (re) ถูกต้องเสมอ
Daan

7
ฉันไม่เข้าใจการโหวตทั้งหมด ... สิ่งนี้ใช้ไม่ได้เลยเอกสาร MSDNมีความชัดเจนการทำเช่นนี้จะนำไปสู่ ​​ArgumentException หาก autoSizeColumnsMode มีค่า None หรือ Fill
Larry

31

รหัสของ Miroslav Zadravec รุ่น AC #

for (int i = 0; i < dataGridView1.Columns.Count-1; i++)
{
    dataGridView1.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
}
dataGridView1.Columns[dataGridView1.Columns.Count - 1].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;

for (int i = 0; i < dataGridView1.Columns.Count; i++)
{
    int colw = dataGridView1.Columns[i].Width;
    dataGridView1.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
    dataGridView1.Columns[i].Width = colw;
}

โพสต์เป็น Community Wiki เพื่อไม่ให้ชื่อเสียงของผู้อื่นเสื่อมเสีย


15

ในใบสมัครของฉันฉันได้ตั้งค่า

grid.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
grid.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None;

นอกจากนี้ฉันได้ตั้งค่าไฟล์

grid.AllowUserToOrderColumns = true;
grid.AllowUserToResizeColumns = true;

ตอนนี้ความกว้างของคอลัมน์สามารถเปลี่ยนแปลงได้และผู้ใช้สามารถจัดเรียงคอลัมน์ใหม่ได้ มันใช้ได้ดีสำหรับฉัน

บางทีนั่นอาจจะเหมาะกับคุณ


การตั้งค่า AutoSizeColumnsMode ของกริดเป็น "Fill" ดูเหมือนว่าจะตั้งค่าคอลัมน์ทั้งหมดให้มีความกว้างเท่ากัน ใช่แล้วคอลัมน์จะปรับขนาดได้ แต่ความกว้างเริ่มต้นผิดทั้งหมด ฉันอาจต้องตั้งค่าความกว้างของคอลัมน์ในโค้ด "ด้วยตนเอง"
Stuart Helwig

DV- grid.AutoSizeColumnsMode = DataGridViewAutoSizeColumn-> s <- Mode.Fill; (คุณพลาดมันคือ ColumsMode ทางด้านซ้ายมือและทางขวามือดังนั้นบรรทัดของคุณจะไม่คอมไพล์) โค้ดที่จะได้รับ datagridview เพื่อปรับขนาดอัตโนมัตินั้นน่ารำคาญมากดังนั้นอย่างน้อยก็ตรวจสอบคำตอบของคุณก่อน . มันเป็นบรรทัดแรกที่คุณเขียนและผิด
barlop

@barlop ขอบคุณสำหรับการตอบกลับของคุณ คุณมีสิทธิพิเศษในการแก้ไขคำถามและคำตอบ หากคุณพบข้อผิดพลาดในรหัสของฉันอย่าลังเลที่จะแก้ไข
Jehof

12

หลังจากเพิ่มข้อมูลลงในตารางแล้วให้เพิ่มรหัสต่อไปนี้ซึ่งจะปรับคอลัมน์ตามความยาวของข้อมูลในแต่ละเซลล์

dataGrid1.AutoResizeColumns();            
dataGrid1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;

นี่คือผลลัพธ์

ใส่คำอธิบายภาพที่นี่


9

ฉันทำแบบนี้:

dgvReport.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
dgvReport.AutoResizeColumns();
dgvReport.AllowUserToResizeColumns = true;
dgvReport.AllowUserToOrderColumns = true;

ตามลำดับนั้น ๆ คอลัมน์จะถูกปรับขนาด (ขยาย) และผู้ใช้สามารถปรับขนาดคอลัมน์ได้ในภายหลัง


6

หากฉันเข้าใจคำถามอย่างถูกต้องควรมีวิธีที่ง่ายกว่าในการบรรลุสิ่งที่คุณต้องการ โทร dgvSomeDataGrid.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);

ที่ควรทำเคล็ดลับ อย่างไรก็ตามมีข้อผิดพลาดประการหนึ่งเนื่องจากคุณไม่สามารถเรียกวิธีนี้ได้โดยตรงหลังจากเติมข้อมูลการควบคุม DataGridView ของคุณ คุณจะต้องเพิ่ม EventHandler สำหรับเหตุการณ์ VisibleChanged แทนและเรียกใช้เมธอดในนั้น


1
ซึ่งจะปรับขนาดคอลัมน์ตามเนื้อหา แต่ไม่แน่ใจว่าจะใช้พื้นที่ตารางที่มีอยู่ทั้งหมด กล่าวคือไม่ "เติมเต็ม" ช่องว่างที่เหลือหากมี
Stuart Helwig


4

ดำเนินการต่อของคำถาม:
ปรับความกว้างของคอลัมน์ให้เข้ากับเนื้อหา (ด้วยวิธีการที่แตกต่างกันในคอลัมน์)
แต่จากนั้นให้ผู้ใช้กำหนดความกว้างของคอลัมน์ ...

พัฒนาจากคำตอบของ Miroslav Zadravecสำหรับฉันสิ่งที่ได้ผลทันทีโดยใช้การคำนวณอัตโนมัติcolumn.Widthเพื่อตั้งค่า ... column.Width!

foreach (DataGridViewColumn column in dataGridView.Columns)
{
    if (/*It's not your special column*/)
    {
        column.AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
        column.Width = column.Width; //This is important, otherwise the following line will nullify your previous command
        column.AutoSizeMode = DataGridViewAutoSizeColumnMode.NotSet;
    }
}

//Now do the same using Fill instead of AllCells for your special column

นี้มีการทดสอบการทำงานเมื่อDataGridViewมีการสร้างไว้แล้วโดยใช้เคล็ดลับเช่นนี้


ฉันชอบใช้ foreach มากกว่ารหัสของคุณ ทำให้อ่านได้ง่ายขึ้นเมื่อคุณไม่มีคณิตศาสตร์อยู่ด้านบนสุดของลูป ฉันทำแบบนั้นและ "column.Width = column.Width;" กำลังสนใจ.
Greg Barth

4

สิ่งนี้ทำให้ฉันมหัศจรรย์:

dataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);

1
วิธีแก้ง่ายๆ!
Mark Kram

1
ทำงานให้ฉันก็ต่อเมื่อตั้งค่าเป็นไม่มีหลังจากนั้นเช่นdataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells); dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
Do-do-new

3

การดำเนินการนี้จะปรับคอลัมน์ทั้งหมดโดยอัตโนมัติตามเนื้อหาเติมพื้นที่ว่างที่เหลือโดยการยืดคอลัมน์ที่ระบุและป้องกันพฤติกรรม "กระโดด" โดยการตั้งค่าคอลัมน์สุดท้ายเพื่อเติมเต็มสำหรับการปรับขนาดในอนาคต

// autosize all columns according to their content
dgv.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);
// make column 1 (or whatever) fill the empty space
dgv.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
// remove column 1 autosizing to prevent 'jumping' behaviour
dgv.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
// let the last column fill the empty space when the grid or any column is resized (more natural/expected behaviour) 
dgv.Columns.GetLastColumn(DataGridViewElementStates.None, DataGridViewElementStates.None).AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;

ฉันรู้ว่ามันเป็นคำตอบแบบเก่า แต่ฉันก็ใช้ได้ดีแม้ว่าจะไม่ทราบจำนวนคอลัมน์ล่วงหน้าก็ตาม
Nilo Paim

2

รหัส C # ที่ใกล้เคียงกว่าเล็กน้อยจากรหัสของ Miroslav Zadravec โดยสมมติว่าคอลัมน์ทั้งหมดจะได้รับการปรับอัตโนมัติ

for (int i = 0; i < dgvProblems.Columns.Count; i++)
{
    dgvProblems.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
    int colw = dgvProblems.Columns[i].Width;
    dgvProblems.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
    dgvProblems.Columns[i].Width = colw;
}

2

รุ่นอื่นของรหัสของ Miroslav Zadravec แต่เป็นแบบอัตโนมัติและเป็นสากลเล็กน้อย:

    public Form1()
    {
        InitializeComponent();
        dataGridView1.DataSource = source;
        for (int i = 0; i < dataGridView1.Columns.Count - 1; i++) {
            dataGridView1.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
        }
        dataGridView1.Columns[dataGridView1.Columns.Count].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;

    }

    void Form1Shown(object sender, EventArgs e)
    {
        for ( int i = 0; i < dataGridView1.Columns.Count; i++ )
        {
            int colw = dataGridView1.Columns[i].Width;
            dataGridView1.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
            dataGridView1.Columns[i].Width = colw;
        }
    }

ฉันใส่ส่วนที่สองลงในเหตุการณ์ที่แยกจากกันเนื่องจากฉันกรอกข้อมูลdatagridvewในการเริ่มต้นของแบบฟอร์มและหากทั้งสองส่วนอยู่ที่นั่นไม่มีอะไรเปลี่ยนแปลงเพราะอาจแสดงการคำนวณความกว้างอัตโนมัติหลังจากdatagridviewนั้นดังนั้นความกว้างยังคงเป็นค่าเริ่มต้นในForm1()วิธีการ หลังจากเสร็จสิ้นวิธีนี้แล้วการปรับขนาดอัตโนมัติจะทำเคล็ดลับและหลังจากนั้น (เมื่อแสดงแบบฟอร์ม) เราสามารถกำหนดความกว้างตามส่วนที่สองของโค้ดได้ (ในForm1Shownกรณีนี้) สิ่งนี้กำลังทำงานให้ฉันเหมือนมีเสน่ห์


2

นี่คือรหัสแบบง่ายสำหรับคำตอบของ Miroslav Zadravec ใน c #:

CurrentDGV.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCellsExceptHeader;
for (int i = 0; i < dataGridView1.Columns.Count; i++) dataGridView1.Columns[i].Width = dataGridView1.Columns[i].Width;
CurrentDGV.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;

1

คุณพยายามตั้งค่าFillWeightคุณสมบัติของDataGridViewColumnsวัตถุของคุณหรือไม่?

ตัวอย่างเช่น:

this.grid1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
this.grid1.Columns[0].FillWeight = 1.5;

ฉันคิดว่ามันน่าจะใช้ได้ในกรณีของคุณ


1

การปรับปรุงเล็กน้อยจากเวอร์ชันของ Schnapple

int nLastColumn = dgv.Columns.Count - 1;
for (int i = 0; i < dgv.Columns.Count; i++)
{
    if (nLastColumn == i)
    {
        dgv.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
    }
    else
    {
        dgv.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
    }
}

for (int i = 0; i < dgv.Columns.Count; i++)
{
    int colw = dgv.Columns[i].Width;
    dgv.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
    dgv.Columns[i].Width = colw;
}


1

ความกว้างของคอลัมน์ที่ตั้งค่าให้พอดีกับเนื้อหาที่ฉันใช้คำสั่งต่อไปนี้ช่วยแก้ปัญหาของฉันได้

ขั้นแรก :

RadGridViewName.AutoSize = true;

ขั้นตอนที่สอง:

// This mode  fit in the header text and column data for all visible rows. 
this.grdSpec.MasterTemplate.BestFitColumns();

ขั้นตอนที่สาม:

for (int i = 0; i < grdSpec.Columns.Count; i++) 
{
    // The column width adjusts to fit the contents all cells in the control.
    grdSpec.Columns[i].AutoSizeMode = BestFitColumnMode.AllCells; 
}

1
foreach (DataGridViewColumn c in dataGridView.Columns)
    c.Width = c.GetPreferredWidth(DataGridViewAutoSizeColumnMode.AllCells, true);

สิ่งนี้ควรใช้งานได้ไม่ว่าจะdataGridViewถูกแสดงหรือไม่ก็ตาม (กล่าวคือแม้ว่าจะถูกเรียกจากตัวสร้างคลาส)

วิธีการเดียวกัน แต่DataGridViewAutoSizeColumnMode.DisplayedCellsล้มเหลวในกรณีข้างต้นด้วยเหตุผลที่ชัดเจน - ยังไม่มีการแสดงเซลล์! ด้วยเหตุผลที่ไม่ชัดเจนบางประการAutoResizeColumnsก็ล้มเหลวในกรณีนี้เช่นกัน


0

หากคุณเชื่อมโยงแหล่งข้อมูลของคุณเข้ากับข้อมูลตัวอย่างเช่นคุณต้องตั้งค่าคุณสมบัติหลังจากการเชื่อมโยงเสร็จสิ้น:

        private void dgv_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
        {
            dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
            dgv.AutoResizeColumns();
            dgv.AllowUserToResizeColumns = true;
        }

0
  • ขอบคุณสำหรับวิธีแก้ปัญหาด้านบน (หากต้องการวนซ้ำให้DataGridView.Columnsเปลี่ยนAutoSizeModeเป็นค่าที่ถูกต้องรวบรวมค่าความกว้างและตั้งค่ากลับหลังจากเปลี่ยนAutoSizeModeเป็นDataGridViewAutoSizeColumnMode.None)
  • ฉันต่อสู้กับมันและสังเกตเห็นมันจะไม่ทำงานเมื่อใดก็ตามที่มันถูกเรียกว่าจากสร้างชั้นหรือสายใด ๆ ก่อนหรือForm.Show() Form.ShowDialog()ดังนั้นฉันจึงใส่ข้อมูลโค้ดนี้ในForm.Shownเหตุการณ์และมันก็ใช้ได้สำหรับฉัน
  • รหัสที่แปลงแล้วของฉันโดยไม่คำนึงถึงDataGridView.AutoSizeColumnsModeชุดใด ๆก่อนหน้านี้ฉันใช้DataGridViewColumn.GetPreferredWidth()แทนการเปลี่ยนDataGridViewColumn.AutoSizeModeและตั้งค่าความกว้างทันทีจากนั้นเปลี่ยนDataGridView.AutoSizeColumnsModeครั้งเดียว:

    private void form_Shown(object sender, EventArgs e)
    {
            foreach (DataGridViewColumn c in dataGridView.Columns)
                c.Width = c.GetPreferredWidth(DataGridViewAutoSizeColumnMode.DisplayedCells, true);
            dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
    }
  • อย่าลืมตั้งค่า

            dataGridView.AllowUserToResizeColumns = true;
  • ฉันไม่รู้ว่าสิ่งนี้จะใช้ได้อย่างไรหลังจากที่แสดงแบบฟอร์มแล้ว


0

ฉันต้องทำสิ่งนี้ใน VB และต้องการแยกออกเป็นวิธีที่ฉันวางไว้ในโมดูล คุณสามารถเพิ่มคอลัมน์ Fill เป็นพารามิเตอร์ ByRef อื่นได้หากต้องการ

''' <summary>
''' Makes all columns in a DataGridView autosize based on displayed cells,
''' while leaving the column widths user-adjustable.
''' </summary>
''' <param name="dgv">A DataGridView to adjust</param>
Friend Sub MakeAdjustableAutoSizedGridCols(ByRef dgv As DataGridView)
    Dim width As Integer

    For Each col As DataGridViewColumn In dgv.Columns
        col.AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells
        width = col.Width
        col.AutoSizeMode = DataGridViewAutoSizeColumnMode.None
        col.Width = width
    Next
    dgv.AllowUserToResizeColumns = True
End Sub

0

คุณสามารถทำสิ่งนี้:

   grd.DataSource = getDataSource();

    if (grd.ColumnCount > 1)
    {
        for (int i = 0; i < grd.ColumnCount-1; i++)
            grd.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;

        grd.Columns[grd.ColumnCount-1].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
    }

    if (grd.ColumnCount==1)
        grd.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;

คอลัมน์ทั้งหมดจะปรับให้เข้ากับเนื้อหายกเว้นคอลัมน์สุดท้ายจะเต็มตาราง


0

ด้วย $ array เป็นเนื้อหาของ PSCustomObject การทำงานนี้:

$dataGridView1.DataSource=[collections.arraylist]($array)
$dataGridView1.Columns | Foreach-Object{$_.AutoSizeMode = [System.Windows.Forms.DataGridViewAutoSizeColumnMode]::AllCells}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.