PDA

View Full Version : سوال: مشكل با سورت كردن دي بي گريد به خاطر وجود space در عنوان ستونها!!!!!!



oghab
سه شنبه 01 بهمن 1387, 18:54 عصر
با سلام
من يك AdoQuery دارم كه فيلدهاي آن در زمان اجرا مشخص ميشوند. چك باكسهايي روي فرم دارند كه با انتخاب آنها، آنها به ليست selectlist مان در adoquery اضافه مي‌شوند و caption هر چك باكس به جاي عنوان آن فيلد در نظر گرفته مي‌شود.
يك dbgrid به اين adoQuery وصل است.
من با استفاده از اين كد ميخواهم كه با كليك بر روي title هر ستون در گريد اطلاعات بر اساس آن ستون مرتب شود و براي اين كار از اين كد استفاده كردم:


procedure TForm1.DBGrid1TitleClick(Column: TColumn);
{$J+}
const PreviousColumnIndex : integer =1;
{$J-}
begin
if DBGrid1.DataSource.DataSet is TCustomADODataSet then
with TCustomADODataSet(DBGrid1.DataSource.DataSet) do
begin
PreviousColumnIndex :=Column.Index;
if (Pos(Column.Field.FieldName, Sort) = 1) and (Pos(' DESC', Sort)= 0) then
Sort := Column.Field.FieldName + ' DESC'
else
Sort := Column.Field.FieldName + ' ASC';
end;
end;

كوئري من مشابه اين كد است. البته با تعداد فيلدهاي خيلي زيادتر


select s_no as 'code', name , family as 'Last Name' from students



مشكل اينجاست كه وقتي روي title ها كليك مي كنم. اگر title شامل چند كلمه باشد و بين آنها Space وجود داشته باشد. خطايي با اين مضمون مي دهد.




Project.Project1.exe raised exception class EoleException with message
'Arguments are of the wrong type, are out of acceptable range, or are in conflict with one onather'.
Process stopped.
Use Step or Run to continue.



اگر در يك button بنويسم




adoquery1.sort:=' Last Name ASC';



باز هم همين خطا را مي دهد.

حدس من اين بود كه مشكل با space هاي بين لغات است. مثلا فاصله بين Last Name . اگر در كوئري به جاي Last_Name براي اين فيلد خطا نمي دهد.



اما مشكل اين است كه عنوان ستونها از caption چك باكسها خوانده مي شود. و اگر عنوانهاي چك باكسها را به صورت Last_Name ظاهر خوشايندي ندارند. و هم تعداد چك باكسها بسيار زياد است و تغيير caption همه آنها زمان زيادي مي برد.

چطور مي تونم بدون حذف فاصله بين عنوانهايي كه براي فيلدها در نظر گرفتم اين مشكل را حل كنم؟

خيلي ممنون ميشم اگر راهنمايي كنيد. نياز فوري براي حل اين مشكل دارم. خودم هر چقدر سعي كردم نتونستم درستش كنم.

merced
سه شنبه 01 بهمن 1387, 18:59 عصر
داخل كروشه بذار


adoquery1.sort:=' [Last Name] ASC';

bmanfy
چهارشنبه 02 بهمن 1387, 18:20 عصر
فکر میکنم به جای تمام کدهایی که نوشتی کد زیر رو بنویسی بهتر باشه و دنگ و فنگ هم نداره .
با فرض بر اینکه DbGrid به AdoQuery1 وصل شده .


procedure TForm1.DBGrid1TitleClick(Column: TColumn);
begin
AdoQuery1.Sort := Column.DisplayName ;
end ;

البته میتونی از DBGrid1.DataSource.DataSet به جای AdoQuery1 استفاده کنی . که خودت هم میدونی .