PDA

View Full Version : سوال: استفاده از dataGrid



water_lily_2012
چهارشنبه 02 شهریور 1390, 18:46 عصر
سلام
من یک دیتاگرید دارم که می خواهم با استفاده از Linq یکی از جدول هایم را در آن بارگذاری کنم. از کدام خاصیت این دیتاگرید باید استفاده کنم و به چه صورت.
لطفا یک کد کامل بنویسید.

PetekDincos
چهارشنبه 02 شهریور 1390, 19:10 عصر
با سلام
با استفاده از خاصیت ItemsSource این کنترل می توانید این کار رو انجام دهید و کوئری که از دیتابیس می گیرید را به این خاصیت بایند کنید با تشکر

water_lily_2012
چهارشنبه 02 شهریور 1390, 19:20 عصر
این کار را انجام میدهم ولی datagrid پر نمیشه.
این هم کد:

private void button1_Click(object sender, RoutedEventArgs e)
{


var db = new ALinq.DataContext("Library.mdb");
var GetBooksQuery = from book in db.GetTable<TBLBook>()
select book;
dataGrid1.ItemsSource = GetBooksQuery;

}
}

[ALinq.Mapping.Table(Name = "TBLBook")]
public class TBLBook
{
[ALinq.Mapping.Column]
public int ID;

[ALinq.Mapping.Column]
public string DOE;

[ALinq.Mapping.Column]
public string Name;

[ALinq.Mapping.Column]
public string Author;

[ALinq.Mapping.Column]
public string BaseTopic;

[ALinq.Mapping.Column]
public string SecondaryTopic;

[ALinq.Mapping.Column]
public int Language;

[ALinq.Mapping.Column]
public string ISBN;

[ALinq.Mapping.Column]
public string Translator;

[ALinq.Mapping.Column]
public string Marker;

[ALinq.Mapping.Column]
public string YearIssuance;

[ALinq.Mapping.Column]
public string Edition;

[ALinq.Mapping.Column]
public int Price;

[ALinq.Mapping.Column]
public string Some;

[ALinq.Mapping.Column]
public string Backlog;

[ALinq.Mapping.Column]
public string Information;
}

water_lily_2012
چهارشنبه 02 شهریور 1390, 19:28 عصر
این هم خطایی که تولید میشه.

74321

PetekDincos
چهارشنبه 02 شهریور 1390, 22:22 عصر
با سلام
آیا کوئری که می گیرید درسته شما با یایند دیتاگراید کاری نداشته باشید اول بررسی کنید که آیا کوئری تون مشکل نداشته باشه چون این Error به بایند دیتاگراید مربوط نمی شه با تشکر

water_lily_2012
چهارشنبه 02 شهریور 1390, 22:50 عصر
درسته کوئری مشکل داره.
مشکل از جدول هست. ولی نمی دونم چرا خطا میده. با یکی دیگه از جدول هام امتحان کردم کوئری درست کار داد.
جدول چطور باشه این خطا را تولید می کنه.

farashah_jalal
پنج شنبه 03 شهریور 1390, 08:39 صبح
پست زیر می تونه بهت کمک کنه.
http://barnamenevis.org/showthread.php?259358-%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF-%D9%88-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-DataGrid-%D8%AF%D8%B1-WPF&highlight=%D9%BE%D8%B1+%DA%A9%D8%B1%D8%AF%D9%86+da tagrid
باز هم اگر مشکلت حل نشد کد رو بزار تا بررسی کنیم.

water_lily_2012
پنج شنبه 03 شهریور 1390, 12:36 عصر
با هزار مکافات بایند را انجام دادم ولی چیزی در دیتاگرید نمایش نمیده.
یعنی به تعداد رکورد های جدول در دیتاگرید رکورد میسازه ولی مقادیر داخلشون نیست.
دستورات هم همانهایی که بالا نوشتم.

farashah_jalal
پنج شنبه 03 شهریور 1390, 13:12 عصر
برای این که بخوای از linq استفاده کنی راحتر این هست که یک Observablecollection بسازی و مقادیر به کمک ان با itemsourse بایند کنی.

var tmp = from u in userRepository.User
select u;
this.AllUser = new ObservableCollection<User>(tmp.ToList());

public ObservableCollection<User> AllUser
{
get;
private set;
}


برای این داده داخل datagrid نمایش بده اون ها رو بایند کردی با مقدایر جدولت مانند مثال زیر؟

<DataGrid FlowDirection="RightToLeft" ItemsSource="{Binding AllUser}" AutoGenerateColumns="False" Height="auto" HorizontalAlignment="Left" Margin="12,55,0,0" Name="dataGrid1" VerticalAlignment="Top" Width="619" >
<DataGrid.Columns>
<DataGridTemplateColumn Header="نام و نام خانوادگی">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=FullName}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="نام کاربری">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding UserName}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="تلفن">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Phon}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="موبایل">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Mobile }" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="تصویر">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Image Width="60" Height="60" Source="{Binding ImagePath}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>

water_lily_2012
پنج شنبه 03 شهریور 1390, 13:23 عصر
خیلی لطف کردید مشکل حل شد.
باید به این صورت می نوشتم.

public int ID { get; set; }

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

dataGrid1.ItemsSource = GetBooksQuery;

farashah_jalal
پنج شنبه 03 شهریور 1390, 13:30 عصر
اما یک مشکل دیگر دارم. من می خواهم همه دستورات را داخل یک کلاس ببرم و از برنامه فقط یک خط کد زیر را اجرا کنم. اما نمی دانم مقدار برگشتی کلاس باید چگونه باشد؟

dataGrid1.ItemsSource = GetBooksQuery;

نظر من این است که از معماری Mvvm استفاده کنید. کد های مربوط به model از view جدا بشه .برای مطالعه در مورد اون و نحوه کار این معماری می تونید پست زیر رو نگاه کنید.
http://barnamenevis.org/showthread.php?196333-%D8%A8%D8%AD%D8%AB-%D9%88-%D8%AA%D8%A8%D8%A7%D8%AF%D9%84-%D9%86%D8%B8%D8%B1-%D8%AF%D8%B1-%D9%85%D9%88%D8%B1%D8%AF-MVVM-Pattern-%D8%AF%D8%B1-Wpf-Programming

PetekDincos
پنج شنبه 03 شهریور 1390, 13:51 عصر
با سلام
نوع برگشتی کلاس برای کوئری شما <نام جدول است>IQueryable با تشکر

water_lily_2012
پنج شنبه 03 شهریور 1390, 15:39 عصر
با سلام
نوع برگشتی کلاس برای کوئری شما <نام جدول است>IQueryable با تشکر

بله درست شد.
ولی چه تفاوتی بین IQueryable با استفاده از Mvvm هست؟
آخه دوستمون گفت که از این معماری استفاده کنم.

ahrimaneahurai
پنج شنبه 03 شهریور 1390, 16:12 عصر
روش MVVM یه روش برای جداسازی کامل بخش طراحی از بخش کدنویسی هست.
تقریبا چیزی شبیه معماری 3 لایه در برنامه های ویندوزی. شما در بخش طراحی در نرم افزار های دیگه طراحیتون رو انجام می دید و کدنویسیتون رو انجام می دید و فقط با استفاده از Bind کردن تمام اطلاعات بخش طراحی رو از بخش کدنویسی یا Model میگیرید.

water_lily_2012
پنج شنبه 03 شهریور 1390, 16:20 عصر
یک مشکل دیگر هم پیش امد.
تعداد ستونهای من دو برابر هست.
اول ستون هایی که به فارسی در دیتاگرید تعریف کرده ام و بعد ستون هایی با نام اصلی آنها در جدول.
چه کنم که فقط فارسی ها را نمایش بده.

PetekDincos
پنج شنبه 03 شهریور 1390, 21:49 عصر
با سلام
پراپرتی AutoGenerateColumns را برای دیتاگراید برابر false قرار بدید با تشکر

water_lily_2012
جمعه 04 شهریور 1390, 16:33 عصر
چرا برای فیلد هایی که در جدول خالی هستند خطا صادر میشه.
چه کار کنم تا مشکل حل بشه؟

حالا من یاد گرفتم اطلاعات را از جدول وارد دیتاگرید کنم.
حالا روش ارسال اطلاعات به چه صورت هست. می خواهم اطلاعات را از چند تا textbox گرفته و یک رکورد جدید در جدول ایجاد بشه.

PetekDincos
جمعه 04 شهریور 1390, 16:59 عصر
با سلام
شما برای وارد کردن داده از چند TextBox و نمایش آن در DataGrid می تونید یک رکورد در جدول ذخیره کرده با توجه به این مقادیر و سپس دوباره از جدول کوئری گرفته و اون را به دیتاگراید بایند کنید اما راه بهینه ای نیست روش بهتر اینه که از ویوها استفاده کنید به این صورت که برای اولین بار که کوئری از دیتابیس می گیرید با توجه به ایبکه کوئری شما IQueryable باشه یا List می تونید به ترتیب از ویوهای BindingListCollectinView و یا ListCollectionView استفاده نمایید به این شکل که یک متغییر از BindingListCollectionView تعریف کرده و بعد از بایند دیتاگراید به وسیله کوئریتون در لود صفحه بیایید ویوتون را به این صورت از دیتاگراید بایند کنید


BindingListCollectionView MyView=(BindingListCollectionView)((CollectionView Source.GetDefaultView(MydataGrid.ItemsSource)));

بعد هر کجا خواستید رکوردی درج نمایید به این صورت مثلا نام جدول شما MyTable است


MyTable NewRecord=(MyTable)(MyView.AddNew());
NewRecord.field in Table=Value;
.
.
MyView.CommitNew();

یک رکورد در دیتاگراید اضافه شده اما در جدول به صورت فیزیکی اضافه نشده که برای این کار هم بایستی در هنگام بستن فرم بسته به اینکه از کدام ORM استفاده می کنید متد SaveChange() و یا SubmitChange() رو فراخوانی کنید تا اطلاعاتتون در دیتابیس نیز ذخیره بشه و برای سوال اولتون نمی دنم چه کار کردید و Error چیه با تشکر