2016-06-11 4 views
-2

"Enter시 다음 셀로 이동"대신 키보드의 화살표 키를 사용하여 cxGrid의 기능을 구현할 수있는 방법이 있습니까? 때리는 "입력"???cxGrid : "enter"를 사용하여 "enter"로 다음 셀로 이동

지금 화살표 키를 사용하여 이동할 수 있지만 내가 이동하는 셀은 선택되지 않습니다 (파란색). 열의 셀을 편집하고 그 아래에있는 셀로 이동하면 (화살표 키 사용) 그리드가 그리드의 다른 임의의 레코드로 이동하여 성가신 것입니다.

설정에 대한 질문입니까, 아니면이 기능을 프로그래밍해야합니까?

편집 : 이것은 데이터를 수집하는 데 사용하는 간단한 임시 테이블입니다. 그것은 어떤 인덱스 필드 또는 자동 증가 (Autoinc) 필드가 없습니다 :

procedure TForm3.cxButton1Click(Sender: TObject); 
begin 
DataModule2.ACRQuery2.Close; 
DataModule2.ACRQuery2.SQL.Clear; 
DataModule2.ACRQuery2.SQL.Text :='insert into TEMP select company_id,member_id,surname,name from MEMBERS where company_id =:a1'; 
DataModule2.ACRQuery2.Params.ParamByName('a1').Value :=cxLookupComboBox2.Text; 
DataModule2.ACRQuery2.ExecSQL; 

DataModule2.ACRQuery3.Close; 
DataModule2.ACRQuery3.SQL.Clear; 
DataModule2.ACRQuery3.SQL.Text :='update temp set month=:a1,year=:a2'; 
DataModule2.ACRQuery3.Params.ParamByName('a1').Value :=cxComboBox2.Text; 
DataModule2.ACRQuery3.Params.ParamByName('a2').Value :=cxTextEdit2.Text; 
DataModule2.ACRQuery3.ExecSQL; 

DataModule2.TEMP.Refresh; 
end; 

데이터 부하를하지만 난 첫 번째 레코드를 편집하고 아래로 화살표로 이동하면, 커서는 그리드의 끝으로 이동합니다. 문제없이 열을 아래로 스크롤하고 내가 일시 정지 어떤 기록을 편집 할 수 있습니다 normally.I 화살표 키 기능

enter image description here

탐색. 그러나 그것을 편집하고 다음 레코드로 이동하자마자 커서가 다른 곳으로 점프합니다. 동기화가 작동하지 않는 것 같습니다. 나는 정말로 모른다. 나는 어떤 식 으로든 분류하지 않는다.

임시 테이블 : enter image description here

+2

DevEx 지원 포럼에 질문 해 보셨습니까? –

+1

리플렉션에서이 q가 MCVE를 포함하도록 편집 될 때까지는 "점프"가 cxGrid **의 기본 동작이 아니므로 주제를 벗어나는 것으로 투표 할 것입니다 ** 그리고 화살표 키 탐색이 기본값입니다 cxGrid의 경우. 따라서 q에는 문제를 재현 할 수있는 충분한 정보가 있어야합니다. – MartynA

+0

@MartynA - 정렬 순서가 없습니다. – user763539

답변

2

는 설정의 문제인가, 아니면이 기능을 프로그래밍해야?

예, 설정에 대한 질문이며 코드가 필요하지 않습니다. 그러나 분명히 먼저 프로젝트를 정렬해야한다고 생각하는 프로젝트의 문제가 있습니다.

"그리드가 눈에 띄지 않는 다른 임의의 레코드로 점프합니다."라고 말하면 잘못된 곳에서 시작하여 원하는대로 탐색 동작을 얻으려는 것처럼 들립니다. 그것은 분명히 일어나서는 안된다. 그리고 내 cxGrid 프로젝트에서는 그렇지 않습니다.

어쨌든 Object Inspector에서 cxGridDBTableView를 표현하면 "나무를 보려면 나무를 보는 것이 어렵습니다"라는 것을 알게되었습니다. 그러면 코드에서 그리드를 완전히 생성하는 프로젝트를 사용하는 것입니다. 아래를 참조하십시오.

아래 코드는 완전히 독립적이며 이벤트 처리기, 영구적 인 TFields 등을 필요로하지 않습니다. 시도 할 경우 기본적으로 생성 된대로 그리드 을 위아래로 지원합니다 및 커서 키를 사용하여 왼쪽 및 오른쪽 셀 탐색. 유일한 예외는 현재 셀 내용을 편집 할 때 왼쪽 및 오른쪽 키가 셀 탐색에 작동하지 않는다는 것입니다. 그러나 왼쪽을 사용하여 당신이 세포 밖으로 이동 할 수 있습니다 라인 바로 데이터 세트로 다시 편집을 게시 셀에서 편집하는 동안 Enter를 눌러 다음

cxView.DataController.Options := cxView.DataController.Options + [dcoImmediatePost]; 

, 그리드의 주석을 해제하는 경우 - 또는 오른쪽 화살표 키. 코드에서 키 처리를 처리하여이 효과를 얻는 방법이 분명하지만 적어도 dcoImmediatePost 메서드는 코드가 필요 없다는 이점이 있습니다.

앱이 시작되면 초점이 맞춰진 LH 셀을 제외하고 상단 행이 "강조 표시됨"(기본적으로 파란색으로 표시됨)을보아야합니다.

이 예제는 프로젝트에서 "점프"의 원인을 확인하는 데 도움이되며 커서 키 탐색과 관련하여 얻고 자하는 바를 설명하는 데 도움이 될 수 있습니다.

코드 내가 문제를 발견 생각 셀 수없이 많은 실험 후

procedure TForm1.CreateGrid; 
begin 
    cxGrid := TcxGrid.Create(Self); 
    cxGrid.Parent := Self; 
    cxGrid.Width := 400; 

    cxLevel := cxGrid.Levels.Add; 
    cxLevel.Name := 'Firstlevel'; 

    cxView := cxGrid.CreateView(TcxGridDBTableView) as TcxGridDBTableView; 
    cxView.Name := 'ATableView'; 
    // Uncomment the following line to make the grid respond to the `Enter` key by posting any pending change to the data row 
    // cxView.DataController.Options := cxView.DataController.Options + [dcoImmediatePost]; 

    cxView.DataController.KeyFieldNames := 'ID'; 

    cxLevel.GridView := cxView; 

    cxView.DataController.DataSource := DS1; 

    cxView.DataController.CreateAllItems; 

end; 

function CreateField(AFieldClass : TFieldClass; AOwner : TComponent; ADataSet : TDataSet; 
AFieldName, AName : String; ASize : Integer; AFieldKind : TFieldKind) : TField; 
begin 
    Result := AFieldClass.Create(AOwner); 
    Result.FieldKind := AFieldKind; 
    Result.FieldName := AFieldName; 
    Result.Name := AName; 
    Result.Size := ASize; 
    Result.DataSet := ADataSet; 
end; 

procedure TForm1.FormCreate(Sender: TObject); 
var 
    i : Integer; 
    Field : TField; 
begin 

    Field := CreateField(TAutoIncField, Self, CDS1, 'ID', 'CDS1ID', 0, fkData); 
    Field := CreateField(TBooleanField, Self, CDS1, 'Marked', 'CDS1Marked', 0, fkData); 
    Field := CreateField(TStringField, Self, CDS1, 'Name', 'CDS1Namefield', 20, fkData); 
    Field := CreateField(TStringField, Self, CDS1, 'Value', 'CDS1Valuefield', 20, fkData); 

    CDS1.CreateDataSet; 

    CDS1.IndexFieldNames := 'ID'; 

    for i := 1 to 5 do begin 
    CDS1.Insert; 
    CDS1.FieldByName('Marked').AsBoolean := Odd(i); 
    CDs1.FieldByName('Name').AsString := 'Name' + IntToStr(i); 
    CDs1.FieldByName('Value').AsString := 'Value ' + IntToStr(i); 
    CDS1.Post; 
    end; 

    CDS1.First; 

    CreateGrid; 

    ActiveControl := cxGrid; 

end; 
+0

음, 내 표에 '점프'가 발생합니다. 열의 첫 번째 셀을 편집하고 화살표가있는 셀을 다음 벨로 우로 이동하면 그리드가 9 행을 건너 뛰고 열 번째 셀로 포커스를 전환합니다. 이것은 편집 할 때만 발생합니다. 네비게이션 자체가 작동합니다. Excel과 같은 동작을하고 싶습니다. – user763539

+0

글쎄, 분명히 그렇게 뛰어서는 안되며, 예제 프로젝트는 점프가 기본적으로 일어나지 않는다는 것을 증명합니다. 당신은 그 자신의 원인을 찾아야합니다. F.i. 점프를 유발하는 편집을 수행 할 때 편집을 통해 색인을 생성 한 데이터 세트의 필드가 변경됩니까? Btw는 SO 규칙에 따라 "왜 작동하지 않는가?"라고 게시 할 때 질문에 MCVE를 포함시켜야합니다. – MartynA

+0

"원인을 찾아야합니다."아마도 SortOrder가 soAscending 또는 soDescending으로 설정된 모눈 열이 있습니까? – MartynA

0

: 그 데이터 컨트롤러는 "그리드 모드"로 설정해야이 기능을 사용하는 것.

+0

죄송합니다, 일반적인 제안으로, 화살표 키 탐색을 얻으려면 GridMode가 True 일 필요가 있다는 생각은 잘못된 것입니다. GridMode는 기본적으로 False입니다. 따라서 True로 설정하면 문제가 해결됩니다. 원인은 q에서 알려주지 않은 것입니다. – MartynA

+0

저는 요즘 devexpress 문서를 읽었습니다. "기본 데이터로드 모드에서 작업하는 ExpressDataController는 레코드 만 정렬하며 기본 데이터 집합의 레코드 순서는 영향을받지 않습니다. 이렇게하면 컨트롤이 대형 데이터 세트에서 더 잘 수행 될 수 있습니다. 그러나 데이터 컨트롤러의 순서와 데이터 세트의 레코드가 더 이상 동기화되지 않으므로 커서가 "점프"하는 효과를 관찰 할 수 있습니다 ... 동기화 모드가 올바르게 작동하지 않는 것으로 보입니다 – user763539

+0

그것은 분명히 Devex가 말했던 것입니다. 나는 투표 마감을 철회했습니다. 나는 cxGrid와 그 전구체를 사용하여 20 년 만에이 점프를 직접 경험하지 못했습니다. 아직 MCVE를 제공하지 않은 것이 유감입니다. 그러나 – MartynA

관련 문제