Автоматично преоразмеряване на редовете на Datagridview

Опитвам се автоматично да коригирам височината на реда и го намирам за много предизвикателство.

Вече съм задал това свойство:

DataGridView.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells.

Направих го и с този друг метод:

DataGridView.AutoResizeRows(DataGridViewAutoSizeRowsMode.AllCellsExceptHeaders)

И също ред по ред, като използвате това:

DataGridView.AutoResizeRow(i, DataGridViewAutoSizeRowMode.AllCells)

И също така дори твърдо кодира височината на реда до голяма стойност и също не работи!! Всички редове се показват с височини по подразбиране.

Нито едно от тези не работи. Свършват ми опциите.

Повечето от редовете в datagridview не е необходимо да се преоразмеряват. Но един от тях е пълен със стойности като тези:

"a" + "\n" + b + "\n" + "c" + "\n" + "d" + "\n" + "e"

Имам предвид кратки стойности, но в различни редове. Трябва да ги покажа в различни редове, не мога да ги покажа всички заедно. Но datagridview показва само първия, а всички останали са скрити, защото редът не се оразмерява автоматично.

Някаква идея за друг начин да го направя.


person monican    schedule 23.11.2012    source източник


Отговори (3)


Трябва да извикате метода за преоразмеряване след като данните са променени. От статията на MSDN на DataGridView.AutoResizeRows():

Височините на редовете се коригират само веднъж на извикване на метод; ако съдържанието на редовете по-късно се промени, редовете няма да се коригират автоматично.

Това означава, че трябва да извикате метода след първото и всяко следващо зареждане на мрежата. Ако извиквате този код в рамките на контролера на родителския формуляр, обвързването на данни все още не се е случило, така че данните не са там.

За първото зареждане с помощта на събитието DataBindingComplete:

dataGridView1.DataBindingComplete += new
    DataGridViewBindingCompleteEventHandler(dataGridView1_DataBindingComplete);

void dataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
    dataGridView1.AutoResizeRows(DataGridViewAutoSizeRowsMode.AllCells);
}

За по-късни актуализации на клетки ще трябва сами да намерите най-доброто място.

person David Hall    schedule 23.11.2012
comment
Причината, поради която сегашният ви подход не работи, вероятно е, че имате кода си в конструктора на формуляри или в събитието onload. - person David Hall; 23.11.2012
comment
Не, всъщност го правя, след като gridsource е зададен на datagridview. Вече е населено. Това е последното нещо, което правя. - person monican; 23.11.2012
comment
@user1062568 кога го правиш? В кой манипулатор на събития? дори ако го направите, след като източникът е зададен, това не е достатъчно, трябва да го направите, след като обвързването на данни приключи. Ако зададете източника и след това извикате resize all в конструктора на формуляри например, това няма да промени височината. - person David Hall; 23.11.2012
comment
Правех го след като решетката беше готова. Всъщност добавях ред по ред, използвайки Rows.Add(). Така че не беше необходимо обвързване. Както и да е, намерих решението, използвайки друго свойство. Все пак благодаря за помощта! - person monican; 23.11.2012

Намерих решението на този проблем. Вместо да работя със свойствата за автоматично оразмеряване на мрежата или редовете, трябваше да използвам wrapmode, който да се приложи към всички клетки на мрежата.

DataGridView.DefaultCellStyle.WrapMode = DataGridViewTriState.True

Това се прилага към всички клетки и работи.

person monican    schedule 23.11.2012
comment
Радвам се, че намерихте решението (предполагах, че вече сте задали wrapmode и виждате множеството редове, преливащи от областта на клетките на мрежата). Ще оставя отговора си, тъй като е правилен за различен проблем (ако актуализирате някоя от клетките си, увеличавайки дължината на данните, преоразмеряването няма да се задейства автоматично). - person David Hall; 23.11.2012
comment
О - и маркирайте това като отговор, така че въпросът да отпадне от списъка без отговор. - person David Hall; 23.11.2012

Това, което опитвате, няма да работи. Трябва да зададете AutoSizeMode на „няма“, след което да промените ширината на колоната. Работи още по-добре, ако зададете колоните ръчно, тъй като предполагам, че вече знаете какви колони имате.

person WaySoft    schedule 22.03.2018