PDA

View Full Version : سوال: دسترسی به سطرهای فیلتر شده Telerik GridView



رامین مرادی
چهارشنبه 21 تیر 1396, 11:27 صبح
دوستان من دیتا گریدم رو فیلتر میکنم اما نمیدونم چطور داده های فیلتر شده رو بریزم تو دیتا تیبل . بجا اینکه فقط داده های فیلتر شده بیان تو دیتا تیبل کل رکوردها میان تو دیتا تیبل. کد منم اینه . ممنون میشم راهنماییم کنید.



DataTable table = new DataTable("dt1");


foreach (Telerik.WinControls.UI.GridViewDataColumn column in dgv1.Columns)
{
table.Columns.Add(column.Name, typeof(string));
}
for (int i = 0; i < dgv1.Rows.Count-1; i++)
{
table.Rows.Add();
for (int j = 0; j < dgv1.Columns.Count; j++)
{
table.Rows[i][j] = dgv1.Rows[i].Cells[j].Value;
}
}

Mahmoud.Afrad
چهارشنبه 21 تیر 1396, 12:09 عصر
در اینگونه موارد بهترین منبع همان داکیومنت اصلی شرکتها هست.
در این مورد در سایت تلریک کد زیر را به عنوان مثال برای فیلترینگ قرار داده
DataTable dt = new DataTable();
public void FillData()
{
dt.Columns.Add("Id", typeof(int));
dt.Columns.Add("Name", typeof(string));
for (int i = 0; i < 30; i++)
{
dt.Rows.Add(i, "Item" + i);
}
this.radGridView1.DataSource = dt;
this.radGridView1.EnableFiltering = true;
this.radGridView1.MasterTemplate.DataView.BypassFi lter = true;
this.radGridView1.FilterChanged += radGridView1_FilterChanged;
}
private void radGridView1_FilterChanged(object sender, GridViewCollectionChangedEventArgs e)
{
if (e.Action == NotifyCollectionChangedAction.Add || e.Action == NotifyCollectionChangedAction.ItemChanged)
{
dt.DefaultView.RowFilter = this.radGridView1.FilterDescriptors.Expression;
}
if (e.Action == NotifyCollectionChangedAction.Remove)
{
dt.DefaultView.RowFilter = "";
}
}
خوبی این کد این هست که فیلتر را روی دیتاتیبل هم اعمال میکند. در اینصورت شما هر جا به داده های فیلتر شده نیاز داشتید از dt.DefaultView میتونید استفاده کنید.

رامین مرادی
چهارشنبه 21 تیر 1396, 12:27 عصر
در اینگونه موارد بهترین منبع همان داکیومنت اصلی شرکتها هست.
در این مورد در سایت تلریک کد زیر را به عنوان مثال برای فیلترینگ قرار داده
DataTable dt = new DataTable();
public void FillData()
{
dt.Columns.Add("Id", typeof(int));
dt.Columns.Add("Name", typeof(string));
for (int i = 0; i < 30; i++)
{
dt.Rows.Add(i, "Item" + i);
}
this.radGridView1.DataSource = dt;
this.radGridView1.EnableFiltering = true;
this.radGridView1.MasterTemplate.DataView.BypassFi lter = true;
this.radGridView1.FilterChanged += radGridView1_FilterChanged;
}
private void radGridView1_FilterChanged(object sender, GridViewCollectionChangedEventArgs e)
{
if (e.Action == NotifyCollectionChangedAction.Add || e.Action == NotifyCollectionChangedAction.ItemChanged)
{
dt.DefaultView.RowFilter = this.radGridView1.FilterDescriptors.Expression;
}
if (e.Action == NotifyCollectionChangedAction.Remove)
{
dt.DefaultView.RowFilter = "";
}
}
خوبی این کد این هست که فیلتر را روی دیتاتیبل هم اعمال میکند. در اینصورت شما هر جا به داده های فیلتر شده نیاز داشتید از dt.DefaultView میتونید استفاده کنید.


ممنون بابت راهنماییتون . ولی متاسفانه این کد فقط اولین رکورد جدولمو برمیگردونه . که تو فیلترم نیست :افسرده:

Mahmoud.Afrad
چهارشنبه 21 تیر 1396, 12:40 عصر
رویداد FilterChanged را هم ایجاد کردید؟ کد کاملتری بزارید.

رامین مرادی
چهارشنبه 21 تیر 1396, 13:28 عصر
رویداد FilterChanged را هم ایجاد کردید؟ کد کاملتری بزارید.


اینم کد های کامل

private void btnPrint_Click(object sender, EventArgs e)
{
StiReport s = new StiReport();
s.Load("Reports\\ShahrebaziReport.mrt");
s.Compile();
// s.RegData("DataSource1", Dt);
s.RegData("Shahrebazi",table);

s.Show();
}
private void dgv1_FilterChanged(object sender, GridViewCollectionChangedEventArgs e)
{
if (e.Action == NotifyCollectionChangedAction.Add || e.Action == NotifyCollectionChangedAction.ItemChanged)
{
table.DefaultView.RowFilter = this.dgv1.FilterDescriptors.Expression;
}
if (e.Action == NotifyCollectionChangedAction.Remove)
{
table.DefaultView.RowFilter = "";
}
}

private void Fill()
{
foreach (Telerik.WinControls.UI.GridViewDataColumn column in dgv1.Columns)
{
table.Columns.Add(column.Name, typeof(string));
}
for (int i = 0; i < dgv1.Rows.Count - 1; i++)
{
table.Rows.Add();
for (int j = 0; j < dgv1.Columns.Count; j++)
{
table.Rows[i][j] = dgv1.Rows[i].Cells[j].Value.ToString();
}
}
this.dgv1.DataSource = table;
this.dgv1.EnableFiltering = true;
this.dgv1.FilterChanged += dgv1_FilterChanged;
}

Mahmoud.Afrad
چهارشنبه 21 تیر 1396, 14:10 عصر
اشتباه متوجه شدید. متد Fill متدی هست که بار اول دیتاگرید رو پر میکنید.

رامین مرادی
پنج شنبه 22 تیر 1396, 07:54 صبح
اشتباه متوجه شدید. متد Fill متدی هست که بار اول دیتاگرید رو پر میکنید.
خب منم برای بار اول دیتا رو پر میکنم تو دیتا تیبل. بعد هنگام فیلتر تو گرید ویو فیلتر درست عمل میکنه اما تو دیتا تبل فقط رکورد اول بانک اطلاعاتی نمایش داده میشه.:افسرده:

Mahmoud.Afrad
پنج شنبه 22 تیر 1396, 20:38 عصر
اینطور نمیشه، کدی که بار اول دیتاگرید رو پر میکنید رو هم بزارید تا اصلاح کنم.

رامین مرادی
شنبه 24 تیر 1396, 09:49 صبح
اینطور نمیشه، کدی که بار اول دیتاگرید رو پر میکنید رو هم بزارید تا اصلاح کنم.





ShahrebaziDA _ShahrebaziDA = new ShahrebaziDA();
table= _ShahrebaziDA.SelectAll();
dgv1.DataSource =table;




من با این هم دیتا تیبل رو پر میکنم هم دیتا گریدم رو

Mahmoud.Afrad
شنبه 24 تیر 1396, 17:15 عصر
به فرض که در سازنده یا formload اطلاعات از دیتابیس دریافت میشه و نام فرم Form1 باشه به صورت زیر(کافیه table.DefaultView.ToTable() را به گزارش ارسال کنید)
DataTable table;

public Form1()
{
InitializeComponent();

ShahrebaziDA _ShahrebaziDA = new ShahrebaziDA();
table = _ShahrebaziDA.SelectAll();
dgv1.DataSource = table;
dgv1.EnableFiltering = true;
dgv1.FilterChanged += dgv1_FilterChanged;
}



private void btnPrint_Click(object sender, EventArgs e)
{
StiReport s = new StiReport();
s.Load("Reports\\ShahrebaziReport.mrt");
s.Compile();
// s.RegData("DataSource1", Dt);
s.RegData("Shahrebazi", table.DefaultView.ToTable());

s.Show();
}
private void dgv1_FilterChanged(object sender, GridViewCollectionChangedEventArgs e)
{
if (e.Action == NotifyCollectionChangedAction.Add || e.Action == NotifyCollectionChangedAction.ItemChanged)
{
table.DefaultView.RowFilter = this.dgv1.FilterDescriptors.Expression;
}
if (e.Action == NotifyCollectionChangedAction.Remove)
{
table.DefaultView.RowFilter = "";
}
}

رامین مرادی
یک شنبه 25 تیر 1396, 08:06 صبح
به فرض که در سازنده یا formload اطلاعات از دیتابیس دریافت میشه و نام فرم Form1 باشه به صورت زیر(کافیه table.DefaultView را به گزارش ارسال کنید)


[/CSHARP]

ممنون ولی جواب نداد. :گریه::ناراحت:
جالبه که با تابع خود تلریک میشه داده های فیلتر شده رو به چاپ ارسال کرد که اونم برا تلریکه.
اما نیازه اینارو بفرستم رو استیمو ریپورت. مطمئنم راهی هست چون وقتی خود تلریک میتونه همچین کاری بکنه پس شدنیه.
تابع عم اینه dgv1.PrintPreview()

Mahmoud.Afrad
یک شنبه 25 تیر 1396, 18:28 عصر
قسمت ارسال داده به گزارش را به صورت table.DefaultView.ToTable() اصلاح کنید


نمونه پروژه (در صورتی که خطا داد رفرنس های تلریک و یا استیمول را حذف و دوباره اضافه کنید)

رامین مرادی
دوشنبه 26 تیر 1396, 08:29 صبح
قسمت ارسال داده به گزارش را به صورت table.DefaultView.ToTable() اصلاح کنید


نمونه پروژه (در صورتی که خطا داد رفرنس های تلریک و یا استیمول را حذف و دوباره اضافه کنید)

آقا واقعا ممنون . بدجور کارمو را انداختی دستت درد نکنه :تشویق:


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

رامین مرادی
دوشنبه 26 تیر 1396, 10:05 صبح
فقط یک مشکل به وجود اومده که زیاد حاد نیست.
بعد از انتخاب شرط فیلتر و اعمال فیلتر مشکلی نیست. بار دوم که بخوام شرط فیلتر رو عوض کنم این خطا برام ظاهر میشه.
145780

خب این تغییرات به نظرتون منجر به این خطا شده؟

Mahmoud.Afrad
دوشنبه 26 تیر 1396, 10:24 صبح
چه کدی اجرا میکنید که به این خطا ختم میشه؟ دقیقا خط اول اون کد یک break point بزارید و با F11 تریس کنید ببینید چه خطی باعث بوجود اومدن خطا میشه. حتما ارجاعی دارید که null هست و دارید به اجزای اون دسترسی پیدا میکنید.

رامین مرادی
دوشنبه 26 تیر 1396, 11:24 صبح
چه کدی اجرا میکنید که به این خطا ختم میشه؟ دقیقا خط اول اون کد یک break point بزارید و با F11 تریس کنید ببینید چه خطی باعث بوجود اومدن خطا میشه. حتما ارجاعی دارید که null هست و دارید به اجزای اون دسترسی پیدا میکنید.


کدی اجرا نمیکنم رو همون سطر فیلتر که یه کلمه رو مینویسم فیلتر انجام میشه. اما وقتی میخوام فیلتر رو عوض کنم و اون علامت قیف رو میزنم و شرطها نشون میدن یکیشون رو که انتخاب میکنم این خطا ظاهر میشه
:متفکر:

تریس هم کردم اون قسمت فیلتر رو تو فیلتر مشکلی نیست . فقط وقتی فیلتر تموم میشه میره تو اون program.cs و خطا نشون داده میشه

راحتترین مورد همین کدی که زحمت کشیدین و برام نوشتین رو تو سیستم خودتون اجرا کنید. بعد تو قسمت فیلتر a رو بنویسید بعد اون قیف رو بزنید و یه مورد از لیست رو انتخاب کنید. و خطا رو مشاهده کنید

Mahmoud.Afrad
دوشنبه 26 تیر 1396, 16:18 عصر
راحتترین مورد همین کدی که زحمت کشیدین و برام نوشتین رو تو سیستم خودتون اجرا کنید. بعد تو قسمت فیلتر a رو بنویسید بعد اون قیف رو بزنید و یه مورد از لیست رو انتخاب کنید. و خطا رو مشاهده کنید

امتحان کردم، با تغییر نوع فیلتر خطایی نداد. مطمئنی نمونه من هم خطا میده؟

رامین مرادی
سه شنبه 27 تیر 1396, 09:10 صبح
امتحان کردم، با تغییر نوع فیلتر خطایی نداد. مطمئنی نمونه من هم خطا میده؟

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

قبل از تغییر نوع فیلتر یک بار متنی وارد کنید سپس فیلتر رو تغییر بدید