PDA

View Full Version : حرفه ای: حذف ردیف در یک DataGrid با استفاده از یک تک دکمه



piroozman
دوشنبه 01 اردیبهشت 1393, 09:49 صبح
با سلام خدمت کلیه عزیزان و علاقه مندان به برنامه نویسی با Silverlight آن هم با استفاده از الگوی MVVM.
اگر این مقاله را دارید می خونید و تازه می خواهید با این الگو آشنا شوید به امضاهای بنده ذیل این مقاله مراجعه کنید. در ضمن سورس این مثال رو در پایین همین صفحه قرار داده ام. به یاد داشته باشید این سورس وقتی کار می کند که شما دیتابیس مربوطه را که طی آموزش های قبلی ارائه شده در محل امضاء بنده ارائه شده است ساخته و رکوردهای لازم را در آن ایجاد کرده باشید.
خدمت سروران عزیزم عرض کنم که روش ذکر شده روشی ساده برای حذف رکورد از دیتاگرید و بالتبع آن از دیتابیس می باشد. روش دیگری وجود دارد که شما می توانید برای هر ردیف در دیتاگرید یک کلید Dlelete پیش بینی کنید که کمی پیچیده تر بوده و به نظر بنده زیاد جالب نیست. با این وجود اگر علاقه ای به این روش دارید می توانید روش ساخت آنرا در اینجا (http://openlightgroup.net/Blog/TabId/58/PostId/57/Deleting-A-Silverlight-DataGrid-Row-With-A-Button-On-The-Row.aspx)مطالعه کنید. نکته دیگر این که این آموزش در ادامه آموزش نحوه استفاده از کنترل Silverlight DataGrid در الگوی MVVM (http://barnamenevis.org/showthread.php?449060-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-%DA%A9%D9%86%D8%AA%D8%B1%D9%84-Silverlight-DataGrid-%D8%AF%D8%B1-%D8%A7%D9%84%DA%AF%D9%88%DB%8CMVVM-%D9%82%D8%B3%D9%85%D8%AA-%D8%A7%D9%88%D9%84) است. پس لطفا پیش از آموزش و اجرای این مقاله به مقاله اشاره شده مراجعه کنید. به بریم سراغ آموزش:
http://silverlight.adefwebserver.com/blogimages/ASimpleDataGridDeleteButtonusingViewMode_D49B/image_thumb.png
براي حذف يک رکورد از جدول RIAComment ابتدا کد زير را به Web Service موجود در پروژه RIADataGrid.Web افزوده و آنرا Build کنيد:
#region DeleteRIACommetn
[WebMethod]
public RIAComment DeleteRIAComment(int RIACommentID)
{
RIATasksDBDataContext DB = new RIATasksDBDataContext();
var result = (from RIAComments in DB.RIAComments
where RIAComments.CommentID == RIACommentID
select RIAComments).FirstOrDefault();
DB.RIAComments.DeleteOnSubmit(result);
DB.SubmitChanges();
return result;
}
#endregion

سپس بر روي Service Reference wsRIARIAComments موجود در پروژه RIADataGrid کليک راست کرده و گزينه Update Service Reference کليک کنيد.
حال به کلاس موجود در پوشه Model تحت عنوان RIACommentsModel.cs مراجعه کرده و کدهاي زير را به آن اضافه کنيد:
#region DeleteRIAComment
public static void DeleteRIAComment(int RIACommentID,
EventHandler<DeleteRIACommentCompletedEventArgs> eh)
{
WebServiceSoapClient WS = new WebServiceSoapClient();
WS.Endpoint.Address = new EndpointAddress(GetBaseAddress());
WS.DeleteRIACommentCompleted += eh;
WS.DeleteRIACommentAsync(RIACommentID);
}
#endregion

جهت ساخت يک ICommand ساده که عمليات delete را اجرا مي کند Command زير را به کلاس MainPageModel.cs واقع در پوشه ViewModel اضافه کنيد.
#region DeleteCommand
public ICommand DeleteCommand { get; set; }
public void Delete(object param)
{
// Clear the Comment
DeleteRIAComment((param as RIAComment).CommentID);
}
private bool CanDelete(object param)
{
return ((param as RIAComment) != null);
}
#endregion

جهت ساخت Command فوق کد زير را به سازنده MainPageModel.cs اضافه کنيد:
DeleteCommand = new DelegateCommand(Delete, CanDelete);

ICommand فوق متد زير را براي اجراي واقعي عمليات Delete فراخواني مي کند و موجب پاک شدن ايتم حذف شده از Collection ي مي شود که DataGrid به آن مقيد شده است (اين چيزي است که موجب حذف رديف در DataGrid مي شود).
#region DeleteRIAComment
private void DeleteRIAComment(int CommentID)
{
// Call the Model to UpdateRIAComment the RIAComment
RIACommentsModel.DeleteRIAComment(CommentID, (Sender, EventArgs) =>
{
if (EventArgs.Error == null)
{
// Find the comment
var CommentInCollection =
(from comment in colRIAComments
where comment.CommentID == EventArgs.Result.CommentID
select comment).FirstOrDefault();
if (CommentInCollection != null)
{
// Remove it
colRIAComments.Remove(CommentInCollection);
}
// Show any errors
Errors = EventArgs.Result.Errors;
// Set the visibility of the Message ListBox
MessageVisibility = (Errors.Count > 0) ?
Visibility.Visible : Visibility.Collapsed;
}
});
}
#endregion

ساخت View
روي MainPage.xaml کليک راست کرده و گزينه Open Expression Blend . . . را انتخاب کنيد:
http://silverlight.adefwebserver.com/blogimages/ASimpleDataGridDeleteButtonusingViewMode_D49B/image_thumb_3.png
يک دکه به پايين صفحه اضافه کنيد.
http://silverlight.adefwebserver.com/blogimages/ASimpleDataGridDeleteButtonusingViewMode_D49B/image_thumb_4.png
در قسمت Preperty دکمه، روي Advanced options در قسمت Command کليک کنيد.
http://silverlight.adefwebserver.com/blogimages/ASimpleDataGridDeleteButtonusingViewMode_D49B/image_thumb_5.png
گزينه Data Binding . . . را انتخاب کنيد.
http://silverlight.adefwebserver.com/blogimages/ASimpleDataGridDeleteButtonusingViewMode_D49B/image_thumb_6.png
در بخش Data Context گزينه DeleteCommand را انتخاب و OK کنيد.
http://silverlight.adefwebserver.com/blogimages/ASimpleDataGridDeleteButtonusingViewMode_D49B/image_thumb_7.png
مجدداً در خواص مربوط به دکمه افزوده شده، روي Advanced options مربوط به command Parameter کليک کنيد.
http://silverlight.adefwebserver.com/blogimages/ASimpleDataGridDeleteButtonusingViewMode_D49B/image_thumb_8.png
گزينه Data Binding . . . را انتخاب کنيد.
http://silverlight.adefwebserver.com/blogimages/ASimpleDataGridDeleteButtonusingViewMode_D49B/image_thumb_9.png
در قسمت Element Property گزينه dataGrid را انتخاب کرده و در قاب سمت راست گزينه SelectedItem و نهايتاً روي OK کليک کنيد.
اجراي پروژه
http://silverlight.adefwebserver.com/blogimages/ASimpleDataGridDeleteButtonusingViewMode_D49B/image_thumb_10.png
وقتي پروژه Build شده و اجرا شد، توجه کنيد که دکمه مربوط به Delete غير فعال است چون هيچ رديفي از ديتاگريد انتخاب نشده است. اين اتفاق به اين دليل است که متد CanDelete موجود در View Model وقتي که رديفي انتخاب نشده باشد و هيچ پارامتري به متد پاس نشده باشد، مقدار False برمي گرداند
http://silverlight.adefwebserver.com/blogimages/ASimpleDataGridDeleteButtonusingViewMode_D49B/image_thumb_11.png
اگر روي رديفي کليک کنيد، دکمه مربوطه فعال شده و جهت حذف رکورد مي توانيد روي آن کليک کنيد.
مي توانيد کدهاي برنامه را از لينک زير دانلود کنيد:
http://silverlight.adefwebserver.com/files/RIADataGridDeleteConfirmation_SingleDeleteButton.z ip