2016-08-17 4 views
-2

제 폼에는 TDBGRid, TDatasource, MessageTable 및 2 버튼이 있습니다. 두 번째 버튼은 현재의 행을 삭제하는 데 사용됩니다델파이 DBGrid 셀이 비어 있지 않습니다.

MessageTable.Append; 
MessageTable.Edit; 
MessageTable.FieldByName('FieldName').AsString := sName; 
MessageTable.Post; 

:

MessageTable.Edit ; 
MessageTable.Delete ; 

방법 포스트 전에 비어 있지 않은 모든 셀을 보장 할 수 있습니다 내 DBGrid를 새로운 행을 추가 할 수있는 버튼이?

빈 셀이 있으면이 행을 무시해야합니다!

어떻게하면됩니까?

+1

편집 라인이 필요하지 않습니다. 추가 된 후 테이블은 dsinsert 상태에 있으며 값을 할당 할 수 있습니다. 또한 삭제하기 전에 dsedit 상태로 테이블을 설정할 필요가 없습니다. –

+1

문제에 대해 구체적으로 설명하십시오. beforepost 이벤트의 모든 필드를 채우거나 afterinsert 이벤트에서 사전 정의 된 값으로 필드를 설정할 수 있습니다. 빈 셀이란 무엇입니까? ondrawdatacell 이벤트의 그리드에서 데이터 레코드를 제외하거나 모든 필드가 채워져 있으면 beforepost 이벤트를 체크 아웃 할 수 있습니다 (<> NULL은 데이터베이스에 따라 다름) –

+1

** 내 DBGRID에 새 행을 추가하는 '버튼'이 있습니다. : ** 당신은 그 버튼의 OnClick 이벤트를 사용하여 데이터의 모든 유효성을 검사 할 수 있습니다. '유효한 데이터 없음'아니요'MessageTable.Append' ..... 유효한 데이터가 아닌'MessageTable.Append'를 호출하는 이유는 무엇입니까? 그리고'beforePost event'에서 그것을 잡아라. –

답변

1

휠을 재발견하려는 대신 이미 데이터 세트 (이 경우 TTable) 기능을 사용해야합니다. TDataSet은이 목적을 위해 특별히 설계된 이벤트 (OnBeforePost)를 제공합니다.

TTable을 클릭 한 다음 Object Inspector의 Events 탭으로 전환하십시오. OnBeforePost 이벤트를 찾아 두 번 클릭하여 코드 편집기에서 이벤트 셸을 생성합니다.

procedure TForm1.Table1BeforePost(DataSet: TDataSet); 
begin 
    // DataSet is the TDataSet (TTable, TQuery, TADOQuery, etc.) to which 
    // event is attached 
end; 

레코드가 실제로 데이터베이스에 기록되기 전에 필요한 모든 유효성 검사를 수행 할 수 있습니다. 당신이 만드는하려는 경우 예를 들어, 반드시 모든 하나의 필드가 뭔가를 가지고, 당신은이 작업을 수행 할 수 있습니다

procedure TForm1.Table1BeforePost(DataSet: TDataSet); 
var 
    i: Integer; 
begin 
    // You can replace DataSet with your actual table variable name, but using it 
    // this way allows you to use this same event for more than one table if you want. 
    for i := 0 to DataSet.FieldCount - 1 do 
    if DataSet.Fields[i].IsNull then 
     raise Exception.CreateFmt('Field %s has no value', DataSet.Fields[i].FieldName); 
end; 

를 확실 특정 필드 값을, 또는 확인하려면 값이 특정 범위 내에 있는지 직접 필드에 액세스 할 수 있습니다

procedure TForm1.Table1BeforePost(DataSet: TDataSet); 
begin 
    if DataSet.FieldByName('MyField').IsNull then 
    Abort; // This silently cancels the post without telling the user  
    if DataSet.FieldByName('AField').AsInteger = 0 then 
    raise Exception.Create('AField must not be 0'); 
end; 

지금 당신은 당신을 TDBGrid에 전혀 아무것도 할 필요가 없습니다. 사용자가 마지막 행의 DownArrow에 도달하여 새 행이 삽입되고 불완전하거나 잘못된 데이터를 입력하면 위의 이벤트가 처리합니다. 또한 이벤트가 다른 모든 것을 처리하기 때문에 두 개의 버튼 (삽입 또는 편집하고 게시하는 버튼)을 사용하는 경우에도 작동합니다.

procedure TForm1.ButtonInsertClick(Sender: TObject); 
begin 
    Table1.Insert; // Or Append - if you have an index on the table they're the same thing 
end; 

procedure TForm1.ButtonPostClick(Sender: TObject); 
begin 
    Table1.Post; // This is 100% of the code you need here 
end;