PDA

View Full Version : سوال: بایند مجدد Datagrid



Program.net
پنج شنبه 17 شهریور 1390, 12:13 عصر
با سلام
چجوری دیتاگرید رو بعد از انجام عملیات درج فرش کرد؟

مهدی فرزاد
شنبه 19 شهریور 1390, 00:41 صبح
سلام
روش های مختلفی برای درج اطلاعات در دیتا گرید وجود داره که رفرش شدن دیتا گرید با توجه به روش کار شما میتونه متفاوت باشه ، بعضی روش ها اصلا نیازی به رفرش شدن نداره و خود بخود تغییر اطلاعات همزمان در دیتا گرید اعمال میشه ، شما از چه روشی استفاده کردید؟
کدتون رو بنویسید یا یک نمونه فایل پیوست کنید

Program.net
شنبه 19 شهریور 1390, 08:39 صبح
ممنونم . من اطلاعاتم رو از طریق یک فرم فرزند میخام وارد گرید کنم از linq هم استفاده کردم
<my:DataGrid Name="dataGrid1" AutoGenerateColumns="False" AlternatingRowBackground="#FFDFE8E8" ItemsSource="{Binding}" GridLinesVisibility="Horizontal" ">

<my:DataGrid.Columns>

<my:DataGridTextColumn Header="ردیف" Binding="{Binding Path=ID}" IsReadOnly="True" Width="50"/>

<my:DataGridTextColumn Header="نام" Binding="{Binding Path=Name}" IsReadOnly="True" Width="80"/>

<my:DataGridTextColumn Header="نام خانوادگی" Binding="{Binding Path=Family}" IsReadOnly="True" Width="110"/>

<my:DataGridTextColumn Header="نام پدر" Binding="{Binding Path=Father}" IsReadOnly="True" Width="70"/>

<my:DataGridTextColumn Header="شماره پرونده" Binding="{Binding Path=Rid}" IsReadOnly="True" Width="90"/>

<my:DataGridTextColumn Header="تاریخ تحویل" Binding="{Binding Path=SendDate}" IsReadOnly="True" Width="100"/>

</my:DataGrid.Columns>

</my:DataGrid>


اینم کد گرید هست . در ضمن این گرید توی یک user conrtol هست که توی mainwindow داینامیکی لود میشه

مهدی فرزاد
شنبه 19 شهریور 1390, 10:02 صبح
سلام مجدد
منظور من کدی هست که برای linq نوشتی و به چه شکل به گرید ارتباط میدی؟
یکی از روش ها استفاده از ListColletionView هست که نیازی به رفرش نداره
اگر روش استفاده رو نمیدونی بگو تا مثال بگذارم

Program.net
شنبه 19 شهریور 1390, 10:54 صبح
آهان ببخشید. من از همین روش معمول استفاده کردم
این روشی رو که میگید نمیدونم


var








bimar = from bm in DH.tbl_wrokCircuits





select bm;

dataGrid1.ItemsSource = bimar;

Program.net
شنبه 19 شهریور 1390, 14:26 عصر
یکی از روش ها استفاده از ListColletionView

من یکم سرچ کردم ولی متوجه نشدم چجوری ربطش بدم به گرید؟!؟!؟!؟!؟!؟!؟!؟!!؟!؟!؟!؟

Program.net
یک شنبه 20 شهریور 1390, 10:37 صبح
آقای mehdi550u من هنوز منتظرم :افسرده:

مهدی فرزاد
یک شنبه 20 شهریور 1390, 12:19 عصر
سلام
این یک نمونه که براتون درست کردم

Program.net
یک شنبه 20 شهریور 1390, 14:32 عصر
خییییلی ممنونم از لطفتون

Program.net
سه شنبه 29 شهریور 1390, 19:52 عصر
سلام

میشه روش edit کردن باlistcollectionview رو هم توضیح بدید؟ listcollectionview یاIeditablelistcollectionview .
من واسه ویرایش مشکل دارم. اکه بخام از طریق فرم فرزند این کارو بکنم refresh انجام نمیشه

مهدی فرزاد
چهارشنبه 30 شهریور 1390, 11:09 صبح
سلام
من یک توضیحاتی به همراه مثال به شما میدم

من یک ChildWindow درست کردم که دوتا تکس باکس توش هست که کدش رو در زیر مینویسم
<TextBox Height="23" HorizontalAlignment="Left" Margin="10,36,0,0" Name="txtName" VerticalAlignment="Top" Width="120" Text="{Binding Name, UpdateSourceTrigger=Explicit}"/>
<TextBox Height="23" HorizontalAlignment="Left" Margin="157,36,0,0" Name="txtTel" VerticalAlignment="Top" Width="120" Text="{Binding Tel,UpdateSourceTrigger=Explicit}"/>

اگر دقت کرده باشید این تکس باکس ها Bind شدن و در کد Binding اونها نوشته شده UpdateSourceTrigger=Explicit این به این علت هست که تا زمانی که ما فرمان ندادیم اطلاعات جدید جایگزین اطلاعات قدیم در سورسی که با این تکس باکس ها Bind شده نشود چرا؟ چون ممکنه شما اطلاعات رو تغییر بدید اما منصرف بشید و ثبت نکنید و فرم رو ببندید پس نباید تغییر در دیتاگرید پیدا بشه

حالا
توی همون فرم اولی که داشتیم من یک دکمه اضافه کردم که باعث نمایش ChildWindow به همراه اطلاعات رکورد انتخاب شده میشه
private void btnNewWin_Click(object sender, RoutedEventArgs e)
{
if (this.dataGrid1.SelectedItems.Count == 1)
{
ChildWindow chWin = new ChildWindow { Owner = this, DataContext = this.dataGrid1.SelectedItem };
chWin.ShowDialog();

}
}

دقت کنید ما چک میکنیم که اگر یک رکورد انتخاب شده بود این عمل انجام بشه
در کد بالا ما DataContext فرم CHild رو برابر this.dataGrid1.SelectedItem قرار دادیم این کار باعث میشه که اون Bindig که در فرم Child انجام داده بودیم اطلاعات این رکورد رو نشون بده و هر تغییر در اون TextBox ها باعث تغییر اطلاعات رکورد و همچنین باعث تغییر در شئی db که توی مثال قبل ساخته بودیم بشه (اما یادتون نره ما با تنظیم bindng در حالت UpdateSourceTrigger=Explicit باعث میشیم این تغییرات هر وقت ما بخواهیم اعمال بشه

حالا

توی Child Window یک Button برای ثبت گذاشتیم
private void btnUpdate_Click(object sender, RoutedEventArgs e)
{

BindingExpression binex;
binex = this.txtName.GetBindingExpression(TextBox.TextProp erty);
binex.UpdateSource();

binex = this.txtTel.GetBindingExpression(TextBox.TextPrope rty);
binex.UpdateSource();

(this.Owner as MainWindow).Update();
MessageBox.Show("Update");


}

کد بالا چکار میکنه :
BindingExpression binex;
binex = this.txtName.GetBindingExpression(TextBox.TextProp erty);
binex.UpdateSource();
باعث میشه اون تغییری که دادیم در سورسی که به TextBox Name وصل هست اعمال بشه و در نتیجه در گرید و شئی db هم اعمال میشه
تغییرات در دیتا گرید منعکس شده (نکته اگر UpdateSourceTrigger=Explicit رو نمیگذاشتید این تغییرات بدون فرمان ما هم منعکس میشد و به کد بالا نیاز نبود)

حالا کد زیر
(this.Owner as MainWindow).Update();
متد update رو که در فرم اصلی ساختیم فراخونی میکنه که یک دستور ساده توش هست
public void Update()
{
this.db.SubmitChanges();
}

تغییرات در دیتابیس ذخیره شد

djnew2009
جمعه 01 مهر 1390, 23:17 عصر
آهان ببخشید. من از همین روش معمول استفاده کردم
این روشی رو که میگید نمیدونم


var








bimar = from bm in DH.tbl_wrokCircuits





select bm;

dataGrid1.ItemsSource = bimar;




شما فرق , IEnumrable IQueryable
می دونی چیه؟؟؟؟؟
dataGrid1.ItemsSource = bimar.ToList();

Program.net
شنبه 02 مهر 1390, 09:24 صبح
فکر کنم بدونم IEnumarable داده قابل شمارش هستش و در ضمن وقتی اجرا میشه به دیتابیس ارجاع میکنه و دادهها رو در یافت میکنه
ولی Iqueryable تا زمانی که متد Tolist() یا ..... اجرا نشه هیچ ارجاعی به دیتابیس انجام نمیشه درسته ؟!؟!؟!؟!؟!؟!؟