PDA

View Full Version : حرفه ای: بدست آوردن مقدار یک سلول از DataGrid در WPF & Entity-FramWork



yasser93
یک شنبه 07 شهریور 1395, 22:06 عصر
سلام. من دیتا گریدمو با استفاده از کد زیر پر میکنم

var Qselect = (from w in db.Workshops
join wt in db.WorkshopTypes on w.WorkshopTypeId equals wt.WorkshopTypeId
join tt in db.TransferTypes on w.WorkshopTransfer equals tt.TransferTypeId
where w.WorkshopDate.Contains("1395/05/01")
orderby w.WorkshopDate
select new
{
WorkshopId = w.WorkshopId,
WorkshopDate = w.WorkshopDate,
WorkshopTypeId = wt.WorkshopTypeName,
WorkshopDetails = w.WorkshopDetails,
FusionId = w.FusionId,
WorkshopTransfer = tt.TransferTypeName,
WorkshopWeight = w.WorkshopWeight
}).Take(10);
grdWorkshop.ItemsSource = Qselect.ToList();

و دیتا گرید با این کد ساخته شده

<DataGrid x:Name="grdWorkshop" AutoGenerateColumns="False" >
<DataGrid.Columns>
<DataGridTextColumn Header="id" Width="50" Binding="{Binding WorkshopId}" />
<DataGridTextColumn Header="Date" Width="140" Binding="{Binding WorkshopDate }"/>
<DataGridTextColumn Header="Type" Width="110" Binding="{Binding WorkshopTypeId }"/>
<DataGridTextColumn Header="Detail" Width="220" Binding="{Binding WorkshopDetails }"/>
<DataGridTextColumn Header="Series" Width="80" Binding="{Binding FusionId }"/>
<DataGridTextColumn Header="Transfer" Width="130" Binding="{Binding WorkshopTransfer }"/>
<DataGridTextColumn Header="Weight" Width="100" Binding="{Binding WorkshopWeight }"/>
</DataGrid.Columns>
<DataGrid.ContextMenu>
<ContextMenu >
<MenuItem Header="Add" Click="AddWorkshopItem" />
<MenuItem Header="Edit" Click="EditWorkshopItem" />
<MenuItem Header="Delete" Click="DeleteWorkshopItem" />
</ContextMenu>
</DataGrid.ContextMenu>
</DataGrid>

حالا من میخوام با استفاده از context menu حذف و ویرایش کنم که ویرایش از طریق یه پنجره دیگه انجام میشه. برای این عملیات نیاز به به دسترسی به فیلد های سطر انتخابی هستم ولی نمیدونم چطوری اینکارو بکنم.
با این کد دیدم که انجام میشه اما فکر کنم چون دیتاگرید من حاصل جوین چندتا جدوله خطا میده
int id = (grdWorkshop.SelectedItem as Workshop).WorkshopId;
از WPF و تکنولوژی EF 6.0 و ویژوال 2013 استفاده میکنم.
ممنون میشم اگه راهنمایی کنید.

ali_md110
یک شنبه 07 شهریور 1395, 22:44 عصر
سلام
شما باید ItemSourceدیتاگرایدتون رو هم مشخص کنید این دیتاسورس معمولا یک لیست جنریک از کلاسی هست شامل فیلدهایی که توی دیتاگراید مشخص کردید و به بانک برنامه بوسیله ef متصل میشه

yasser93
یک شنبه 07 شهریور 1395, 22:49 عصر
سلام
شما باید ItemSourceدیتاگرایدتون رو هم مشخص کنید این دیتاسورس معمولا یک لیست جنریک از کلاسی هست شامل فیلدهایی که توی دیتاگراید مشخص کردید و به بانک برنامه بوسیله ef متصل میشه
خب من الان دیتاگریدم یه جدول از دیتابیس نیست دیتاسورس رو باید چی بدم بهش ؟؟
بعد چطوری دسترسی پیدا کنم به اطلاعات؟؟
من اولین پروژه ام به این صورت هست برا همین تجربه اشو ندارم

Mahmoud.Afrad
دوشنبه 08 شهریور 1395, 00:22 صبح
یک کلاس(مثلا به نام MyClass) با پراپرتی های مورد نیاز ایجاد کنید، در هنگام سلکت یک نمونه از این کلاس ایجاد و مقداردهی کنید.
//...
select new MyClass()
{
// set properties here
}).Take(10);
در رویداد مناسب، SelectedItem رو به MyClass تبدیل کنید و...

yasser93
دوشنبه 08 شهریور 1395, 02:40 صبح
یک کلاس(مثلا به نام MyClass) با پراپرتی های مورد نیاز ایجاد کنید، در هنگام سلکت یک نمونه از این کلاس ایجاد و مقداردهی کنید.
//...
select new MyClass()
{
// set properties here
}).Take(10);
در رویداد مناسب، SelectedItem رو به MyClass تبدیل کنید و...
سلام. ممنون بابت پاسخگویی تون.
یکم مبهمه برام
من الان یه کلاس مشابه نمونه دیتاگریدم ایجاد کردم(انواع داده ای رو برا هر ستون لحاظ کردم) و پراپرتی هارو هم کامل ایجاد کردم.


class cWorkshop
{
private int _WorkshopId;
private string _WorkshopDate;
private string _WorkshopTypeId;
private string _WorkshopDetails;
private int _FusionId;
private string _WorkshopTransfer;
private decimal _WorkshopWeight;
}


اینکه میگید در هنگام سلکت مقدار دهی کنم رو نمیفهمم یعنی کجا؟؟ چون من در چندین جای مختلف به دیتاگرید مقدار میدم(متناظر با شرایط جستجو) بعد فقط در دو تا رویداد نیاز دارم تا اطلاعات سطر انتخابی رو بگیرم. و اصلا نمیدونم چطوری اینارو بریزم توی این کلاسی که ایجاد کردم :افسرده:
اگه ممکنه یه مثال کوچولو و خلاصه از کاری که باید انجام بدم بزنید ممنون میشم. کل پروژه ام لنگ این مونده
با تشکر

Mahmoud.Afrad
دوشنبه 08 شهریور 1395, 03:02 صبح
اگر کلاستون بصورت زیر باشه
class CWorkshop
{
public decimal WorkshopWeight { get; set; }
public int WorkshopId { get; set; }
public string WorkshopDate { get; set; }
public string WorkshopTypeId { get; set; }
public string WorkshopDetails { get; set; }
public int FusionId { get; set; }
public string WorkshopTransfer { get; set; }
}
در کوئری در خطی که سلکت انجام میشه(خط ششم) یک نمونه از این کلاس ایجاد کنید
select new CWorkshop()
به صورت زیر به پراپرتیها دسترسی دارید
int id = (grdWorkshop.SelectedItem as CWorkshop).WorkshopId;

yasser93
دوشنبه 08 شهریور 1395, 03:14 صبح
اگر کلاستون بصورت زیر باشه
class CWorkshop
{
public decimal WorkshopWeight { get; set; }
public int WorkshopId { get; set; }
public string WorkshopDate { get; set; }
public string WorkshopTypeId { get; set; }
public string WorkshopDetails { get; set; }
public int FusionId { get; set; }
public string WorkshopTransfer { get; set; }
}
در کوئری در خطی که سلکت انجام میشه(خط ششم) یک نمونه از این کلاس ایجاد کنید
select new CWorkshop()
به صورت زیر به پراپرتیها دسترسی دارید
int id = (grdWorkshop.SelectedItem as CWorkshop).WorkshopId;

خیلی ممنون که وقت میزارید.
یعنی من هر وقت که یک کووری برای پر کردن دیتاگرید استفاده کردم کووری رو به این شکل تغییر بدم؟؟(چندین بار با شرایط مختلف کووری ایجاد شده ولی فقط قسمت where تغییر کرده.

var Qselect = (from w in db.Workshops
join wt in db.WorkshopTypes on w.WorkshopTypeId equals wt.WorkshopTypeId
join tt in db.TransferTypes on w.WorkshopTransfer equals tt.TransferTypeId
where w.WorkshopDate.Contains("1395/05/01")
orderby w.WorkshopDate
select new cWorkshop()
{
WorkshopId = w.WorkshopId,
WorkshopDate = w.WorkshopDate,
WorkshopTypeId = wt.WorkshopTypeName,
WorkshopDetails = w.WorkshopDetails,
FusionId = w.FusionId,
WorkshopTransfer = tt.TransferTypeName,
WorkshopWeight = w.WorkshopWeight
}).Take(10);


و سپس در رویداد مورد نظر از دستور آخر استفاده کنم؟؟
با سپاس فراوان

yasser93
دوشنبه 08 شهریور 1395, 03:18 صبح
اگر کلاستون بصورت زیر باشه
class CWorkshop
{
public decimal WorkshopWeight { get; set; }
public int WorkshopId { get; set; }
public string WorkshopDate { get; set; }
public string WorkshopTypeId { get; set; }
public string WorkshopDetails { get; set; }
public int FusionId { get; set; }
public string WorkshopTransfer { get; set; }
}
در کوئری در خطی که سلکت انجام میشه(خط ششم) یک نمونه از این کلاس ایجاد کنید
select new CWorkshop()
به صورت زیر به پراپرتیها دسترسی دارید
int id = (grdWorkshop.SelectedItem as CWorkshop).WorkshopId;

آقا یه دنیا ممنون مشکل حل شد. همین کارو کردم جواب داد :قلب::قلب::قلب::قلب::قلب:

yasser93
دوشنبه 08 شهریور 1395, 04:09 صبح
select new CWorkshop()


الان با اضافه کردن این دستور یه مشکل جدید پیش اومد.
من قبلا با این دستور چک میکردم که آیا contex Menu بر روی یک سطر باز شده یا در یک فضای خای از دیتاگرید. که اگر سطری انتخاب نشده باشه اطلاعاتی نخونه و اتفاقی نیفته.

if (grdWorkshop.SelectedCells.Count > 0)

اما الان با ساختن کلاس هنگام select یک ردیف خالی انتهای دیتاگرید من ایجاد شد و با انتخاب اون وقتی context menu باز میشه این شرط رو قبول میکنه و چون مقداری وجود نداره Exception میده.
آیا راهی برای رفع این خطا وجود داره ؟؟

yasser93
دوشنبه 08 شهریور 1395, 04:19 صبح
الان با اضافه کردن این دستور یه مشکل جدید پیش اومد.
من قبلا با این دستور چک میکردم که آیا contex Menu بر روی یک سطر باز شده یا در یک فضای خای از دیتاگرید. که اگر سطری انتخاب نشده باشه اطلاعاتی نخونه و اتفاقی نیفته.

if (grdWorkshop.SelectedCells.Count > 0)

اما الان با ساختن کلاس هنگام select یک ردیف خالی انتهای دیتاگرید من ایجاد شد و با انتخاب اون وقتی context menu باز میشه این شرط رو قبول میکنه و چون مقداری وجود نداره Exception میده.
آیا راهی برای رفع این خطا وجود داره ؟؟

خب خدارو شکر این مسئله هم با این دستور حل شد.
گفتم بزارم اینجا شاید کسی بخواد استفاده کنه

CanUserAddRows="False"