2016-06-29 8 views
1

에 셀을 변경 사건?cxgrid 하이라이트 (또는 색상) 내가 가지고있는 형태의 closequery에 폼 closequery

변경된 내용을 알 필요는 없지만 사용자가 볼 수 있도록 변경된 셀을 알기 만하면 날씨를 쉽게 결정하여 변경 사항을 저장할지 여부를 결정할 수 있습니다.

+0

나는 당신이 달성하고자하는 것을 좀더 완전히 설명 할 필요가 있다고 생각한다. 같은 행의 여러 열이 변경된 경우 어떻게해야합니까? "변경됨"이라고 말하면 이미 데이터 세트에 저장된 변경 사항을 포함한다는 의미입니까? 데이터 세트가 ApplyUpdates()를 수행합니까? – MartynA

+0

예, 변경된 경우 전체 행의 모든 ​​셀을 강조하고 싶습니다. 이것은 게시 이벤트 전이므로 아무 것도 저장되지 않았습니다. 그리드는 [dsEdit, dsInsert] 모드입니다. 아니요, 데이터베이스 dos는 applyupdates를 호출하지 않습니다. – user763539

+0

사용자가 테이블을 수정하고 변경 사항을 게시하지 못하고 양식을 닫으려고하는 경우입니다. 따라서 폼을 닫고 (수정 된 모든 데이터를 잃어 버리기 전에) 테이블에 대한 변경 사항이 아직 저장되지 않고 변경된 셀 (셀)을 표시한다고 알려주는 것이 좋습니다. 이해하고 있니? 아마도 쉽게 볼 수 있지만 하이라이트 너무 변경된 세포를 착 색에 대해 생각했다. – user763539

답변

1

cxGrid1DBTableView1CustomDrawCell 이벤트를 사용하여 어떤 방식 으로든 강조 표시된 셀 (또는 행)을 그릴 수있는 cxGrid를 얻는 것은 간단합니다. OnCloseQuery 이벤트가 진행 중임을 나타내는 플래그를 지정하면 해당 이벤트를 해당 이벤트 내부로 제한 할 수 있습니다.

업데이트이 답변으로 처음 게시 한 코드는 현재 그리드 행에 둘 이상의 셀을 변경된 것으로 표시 할 수 없습니다. 그러나 아래의 업데이트 된 코드는이를 수행 할 수 있습니다. 두 절차의 주석을 기록하십시오.

type 
    TForm1 = class(TForm) 
    [...] 
    public 
    QueryingClose : Boolean; 
    end; 

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); 
begin 
    try 
    QueryingClose := True; 
    //{cxGrid1.Invalidate{True); Do NOT call Invalidate, because it causes the 
    // grid's repainting logic to operate in a way which effectively makes it 
    // impossible to mark more that one cell in the current data row as changed 
    ShowMessage('Close?'); 
    finally 
    QueryingClose := False; 
    end; 
end; 

procedure TForm1.cxGrid1DBTableView1CustomDrawCell(Sender: 
    TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: 
    TcxGridTableDataCellViewInfo; var ADone: Boolean); 
var 
    Field : TField; 
    MarkCell : Boolean; 
    S1, 
    S2 : String; 
    EC : TcxGridTableEditingController; 
begin 
    if QueryingClose and 
    (TcxGridDBTableView(Sender).DataController.DataSet.State in[dsEdit, dsInsert]) then begin 
    Field := TcxGridDBColumn(AViewInfo.Item).DataBinding.Field; 
    S1 := VarToStr(Field.OldValue); 

    // When this event is called, the user may be in the middle of editing a cell's contents 
    // So, the purpose of the following lines is to close the inplace editor being used to do 
    // this amd post the chamged value back to the TField associated with the cell 
    EC := TcxGridDBTableView(Sender).Controller.EditingController; 
    if EC.IsEditing then 
     EC.HideEdit(True); 

    S2 := VarToStr(Field.Value); 
    MarkCell := S1 <> S2; 
    if MarkCell then 
     ACanvas.Brush.Color := clLime; 
    end; 
end; 

이렇게하려면 TDataSet-descendant 유형이 필드의 원래 내용을 OldValue 속성에 올바르게 반환해야합니다. 이 코드를 작성/테스트하는 데 사용 된 TClientDataSet은 실제로이 작업을 수행하지만 실제 TDataSet 유형을 사용하고 있는지 전혀 알지 못합니다.

필드 이름 OldValue 및 값을 포함하여 값이 변경된 TField 목록을 작성하려면이 두 절차를 사용할 수 있습니다.

+0

변경된 셀에서 다른 셀로 이동하면 변경된 셀을 강조 표시하지 않습니다. 행이 변경 되었든 아니든 관계없이 마지막으로 방문한 셀만 강조 표시합니다. – user763539

+0

죄송합니다. 구현 세부 정보를 남겨 두었습니다. "OnCloseQuery"이벤트 중에 셀을 강조 표시하거나 색상을 지정하는 방법을 보여주는 "변경된 셀을 강조 표시하거나 색상을 지정할 수있는 방법이 있습니까?" 주어진 세포가 특별한 치료가 아닌지를 결정하는 것은 당신에게 달려 있습니다. – MartynA

+0

오케이, 생각이납니다. 고맙습니다. – user763539