2015-07-09 3 views
1

Предположим, у меня есть набор объектов TField и вы хотите изменить их видимость в некоторых DBGrid динамически. Я также хочу разрешить пользователям изменять порядок столбцов в этом DBGrid и иметь некоторые фиксированные столбцы.Получить объект столбца для поля DataSet

Я знаю proper way to hide/show columns on DBGrid, но есть большой, большой недостаток дизайна в VCL: имея объект Column, можно поехать в его полевой объект, но не можете найти путь назад.

Все, что я хочу, это просто вид столбца свойство внутри объекта Field, так что я могу ввести что-то вроде этого:

Field.Column.Visible := False; 

и скрыть любой столбец внутри DBGrid с присвоенной Columns собственности.

Я знаю, что могу просто создать HashSet или Collection с колонками и быстро найти соответствующие столбцы, но существует ли более прямой способ сделать это?

+4

Там нет абсолютно никакого способа, почему TField должен знать о визуальном представлении, как TDBGrid или TColumn. Что бы вы ожидали от такого свойства, когда набор данных и это поле видны более чем в одной сетке одновременно? –

+0

Хм ... Я бы спрятал или покажу эту колонку во всех подключенных сетках. – Danatela

+0

Свойство 'Field.Visible' определяет, появится ли поле в сетке данных. Я не понимаю, почему его нельзя использовать. –

ответ

1

@UweRaabe уже объяснил, что то, что вы просите, вообще не возможно, в основном , потому что DGGrids знает, с какими полями они связаны, но не наоборот. Поэтому, чтобы делать то, что вы хотите, вам придется самому закодировать его, если вы используете постоянные столбцы в своей сетке.

Я не знаю, знаете ли вы, но для других читателей TField обладает видимыми и индексными свойствами.

Видимое свойство Field может использоваться DBGrids для управления видимостью столбца поля в DBGrid, но только тогда, когда столбцы автоматически создаются, установив DefaultFields сетки в значение true.

Аналогично, индекс поля определяет его номер столбца в DBGrids, но снова только тогда, когда значения DefaultFields DBGrid равны True.

В DBGrid с DefaultFields = True, вы можете изменить видимость номера столбца поля во время выполнения.

Таким образом, хотя вы не можете централизованно управлять видимостью и номером столбца в DBGrid, который имеет постоянные столбцы, вы можете если вы установите DefaultFields Истину и оставить его в сетку (ы) для создания колонны.

5

Если столбец сохраняется, можно использовать что-то вроде:

function FindFieldColumn(Grid : TDBGrid; const FieldName: String): TColumn; 
var 
    i: Integer; 
begin 
    Result := nil; 
    for i := 0 to Grid.Columns.Count - 1 do 
    if AnsiCompareText(Grid.Columns[i].FieldName, FieldName) = 0 then 
     begin 
     Result := Grid.Columns[i]; 
     Break; 
     end; 
end; 

procedure SetVisibleColumn(Grid : TDBGrid; AFieldName : string; AVisible : boolean); 
var 
    Column : TColumn; 
begin 
    Column := FindFieldColumn(Grid,AFieldName); 
    if Assigned(Column) then 
    Column.Visible := AVisible; 
end; 

Зова

SetVisibleColumn(MyGrid,MyField.Name, myField.Visible); 
+0

Спасибо Val, но я считаю, что такое решение дорого. – Danatela

+1

Не дороже, чем код работает из-за движения мыши. – NGLN

+0

@NGLN, если у меня есть 20 столбцов и вы хотите динамически скрыть половину из них, я буду запускать этот цикл 10 раз и выполнить сравнение строк не менее 100 раз. Я не хочу иметь никаких визуальных задержек, а компьютеры в моей компании достаточно медленны, чтобы сделать ее заметной. – Danatela