PDA

View Full Version : سوال: انتقال رکورد های گرید به یک DataTable از طریق FOR



NasimBamdad
چهارشنبه 18 بهمن 1391, 16:15 عصر
سلام و خسته نباشید .


من یک Rad Grid View دارم که با اون اطلاعاتم رو نمایش و فیلتر می کنم . زمانی که با فیلتر کردن اطلاعات گرید من ( کوری ) مخفی می شوند .

یعنی HIDDEN می شوند . ساختار RAD Grid VIEw اینگونه است .

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

شنیدم که با حلقه FOR باید این کار رو کرد . ممنون میشم راهنمایی کنید

morteza271
چهارشنبه 18 بهمن 1391, 19:16 عصر
شنیدم که با حلقه FOR باید این کار رو کرد . ممنون میشم راهنمایی کنید
خوب دیگه پس مشکلتون چیه! با for میتونید اینکار رو بکنید.
البته یه راهه خیلی بهتر هم هست :
اگه گریدتون رو با DataSource پر میکنید میتونید از کد زیر استفاده کنید :
DataTable dtList = dataGridView1.DataSource as DataTable;

موفق باشید

NasimBamdad
پنج شنبه 19 بهمن 1391, 14:23 عصر
خوب دیگه پس مشکلتون چیه! با for میتونید اینکار رو بکنید.
البته یه راهه خیلی بهتر هم هست :
اگه گریدتون رو با DataSource پر میکنید میتونید از کد زیر استفاده کنید :
DataTable dtList = dataGridView1.DataSource as DataTable;

موفق باشید

آخه در RadGrid که با DataSet پرش کردم ، بعد از فیلتر کردن ( فیلتر کردن گرافیکی داره ، نه از DataTable و DataSource ) یک منو بهم میده که تیک می زنم ، متاسفانه رکورد ها رو Hidden می کنه . یعنی اگه من اون DataSource که بهش وصل کردم رو به گزارش بفرستم ، همه داده ها موجود هستند .

morteza271
پنج شنبه 19 بهمن 1391, 20:10 عصر
خوب پس تنها راهتون استفاده از همون for هستش.
خیلی هم راحته...

NasimBamdad
شنبه 21 بهمن 1391, 15:05 عصر
حلقه For رو بلدم . اما چه طوری باید خطوط رو در DataTable بریزم ؟ بعد بذارمشون در حلقه FOR

ma.rad
شنبه 21 بهمن 1391, 15:16 عصر
مثال کد:

using (DataTable dt = new DataTable())
{
dt.Columns.Add("column1", typeof(int));
dt.Columns.Add("column2", typeof(string));
dt.Columns.Add("column3", typeof(int));
foreach (DataGridViewRow dgvR in dgQBM)
{
dt.Rows.Add(dgvR.Cells[0].Value, dgvR.Cells[1].Value);
}
}

NasimBamdad
دوشنبه 23 بهمن 1391, 08:06 صبح
مثال کد:

using (DataTable dt = new DataTable())
{
dt.Columns.Add("column1", typeof(int));
dt.Columns.Add("column2", typeof(string));
dt.Columns.Add("column3", typeof(int));
foreach (DataGridViewRow dgvR in dgQBM)
{
dt.Rows.Add(dgvR.Cells[0].Value, dgvR.Cells[1].Value);
}
}


یه سوالی . الان چه طوری میشه گرید رو در این کد جای داد ؟ الان چه طوری بگم مثلا ستون های GridView من رو در این DataTAble پر کن ؟

Mahmoud.Afrad
دوشنبه 23 بهمن 1391, 08:47 صبح
DataTable dt = new DataTable();
for (int i = 0; i < dataGridView1.Columns.Count; i++)
{
dt.Columns.Add(dataGridView1.Columns[i].Name);
}

for (int i = 0; i < dataGridView1.Rows.Count; i++)
{
dt.Rows.Add();
for (int j = 0; j < dataGridView1.Columns.Count; j++)
{
dt.Rows[i][j] = dataGridView1.Rows[i].Cells[j].Value;
}
}

// use dt
dataGridView2.DataSource = dt;

ابتدا به تعداد ستون گرید به دیتاتیبل ستون اضافه و بعد سطرها را اضافه میکنه.
کد مطابق گرید خودتون تغییر بدید.

NasimBamdad
دوشنبه 23 بهمن 1391, 10:35 صبح
DataTable dt = new DataTable();
for (int i = 0; i < dataGridView1.Columns.Count; i++)
{
dt.Columns.Add(dataGridView1.Columns[i].Name);
}

for (int i = 0; i < dataGridView1.Rows.Count; i++)
{
dt.Rows.Add();
for (int j = 0; j < dataGridView1.Columns.Count; j++)
{
dt.Rows[i][j] = dataGridView1.Rows[i].Cells[j].Value;
}
}

// use dt
dataGridView2.DataSource = dt;

ابتدا به تعداد ستون گرید به دیتاتیبل ستون اضافه و بعد سطرها را اضافه میکنه.
کد مطابق گرید خودتون تغییر بدید.

میگم یه سوالی . گرید من چندین ستون داره . چه طوری ستون های خاص رو بهش بدم ؟

من فکر می کنم با همچین کدی ستون های DataTable رو بسازم .


dt.Columns.Add("column1", typeof(int));
dt.Columns.Add("column2", typeof(string));
dt.Columns.Add("column3", typeof(int));


بعد نمی دونم چه طوری این ستون ها رو با رکورد های فیلتر شده گرید پر کنم !

NasimBamdad
دوشنبه 23 بهمن 1391, 12:18 عصر
وقتی هم از این کد استفاده می کنم Error میده


foreach (DataGridViewRow gridRow in dataGridView1.Rows)
{}



Error اش هم اینه



Cannot convert type 'Telerik.WinControls.UI.GridViewDataColumn' to 'System.Windows.Forms.DataGridViewColumn'



فکر کنم DataGridViewRow و DataGridViewColumn برای RadGridView تعریف نشده اند !

NasimBamdad
سه شنبه 24 بهمن 1391, 10:04 صبح
کسی چیزی پیدا نکرده ؟ راهی نیست ؟

NasimBamdad
سه شنبه 24 بهمن 1391, 15:43 عصر
عزیزان هرکسی بتونه این کار رو انجام بده ، من هزینه اش رو بهش میدم !

ma.rad
سه شنبه 24 بهمن 1391, 16:09 عصر
وقتی هم از این کد استفاده می کنم Error میده


foreach (DataGridViewRow gridRow in dataGridView1.Rows)
{}



Error اش هم اینه




فکر کنم DataGridViewRow و DataGridViewColumn برای RadGridView تعریف نشده اند !


کد بالا برا دیتاگرید وید هست وهیچ مشکلی نداره براحتی دیتاتیبل پر می کنه

khokhan
سه شنبه 24 بهمن 1391, 16:17 عصر
سلام

دیتا گرید اول با لود فرم پر می شه با فشار دادن دکمه محتوای دیتا گرید اولی در دیتا تیبل ذخیره می شه

دیتا گرید دوم هم به دیتا تیبل وصل است
:لبخند:

NasimBamdad
چهارشنبه 25 بهمن 1391, 10:15 صبح
کد بالا برا دیتاگرید وید هست وهیچ مشکلی نداره براحتی دیتاتیبل پر می کنه

درسته واسه DataGridView خود Visual Studio کار می کنه ، ولی وقتی من از Telerik RadGridView استفاده می کنم ERROR میده .

اینم Error اش



Error 1 Cannot convert type 'Telerik.WinControls.UI.GridViewDataColumn' to 'System.Windows.Forms.DataGridViewColumn' F:\Downloads\Compressed\dgv to dt\dgv to dt\dgv to dt\Form1.cs 66 13 dgv to dt

NasimBamdad
چهارشنبه 25 بهمن 1391, 10:16 صبح
سلام

دیتا گرید اول با لود فرم پر می شه با فشار دادن دکمه محتوای دیتا گرید اولی در دیتا تیبل ذخیره می شه

دیتا گرید دوم هم به دیتا تیبل وصل است
:لبخند:

وقتی به جای GridView خود Visual Studio از Telerik RadGridView در کدهای شما که زحمت کشیدید استفاده می کنم این Error رو میده




Error 1 Cannot convert type 'Telerik.WinControls.UI.GridViewDataColumn' to 'System.Windows.Forms.DataGridViewColumn' F:\Downloads\Compressed\dgv to dt\dgv to dt\dgv to dt\Form1.cs 66 13 dgv to dt

NasimBamdad
پنج شنبه 26 بهمن 1391, 10:17 صبح
حضرات کسی نمی نونه این مشکل رو حل کنه ؟ اگه میشه لطفا هزینه اش رو هم پرداخت می کنم !

khokhan
یک شنبه 29 بهمن 1391, 14:39 عصر
حضرات کسی نمی نونه این مشکل رو حل کنه ؟ اگه میشه لطفا هزینه اش رو هم پرداخت می کنم !
درود بر شما

دوست عزیز حالا که کامپوننت Telerik به این شیوه ارور میده می تونی یه کار دیگه بکنی

یعنی به جای این که عمل فیلتر رو در گرید انجام بدی وبعد بیای این اطلاعات فیلتر شده رو از گرید بخونی

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

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



public DataTable ExchangeDataTable(DataTable dt, string Condition)
{


DataTable Newdt = dt.Clone();

//انتخاب ردیفهای مورد نظر
DataRow[] results = dt.Select(Condition);


foreach (DataRow dr in results)
Newdt.ImportRow(dr);
return Newdt;
}

NasimBamdad
یک شنبه 29 بهمن 1391, 15:16 عصر
ایـــــــن لیـــــــنک رو ببینید (http://redup.ir/95746419269177575200.gif)

من نیازم یک گرید هست که اینطوری به صورت Wizard بتونم فیلترش کنم و اطلاعات فیلتر شده رو به dataTable بریزم و بعدش اون رو خودم به StimulReport پاس می دم

ممنونم


جناب khokhan ممنون از پیگیری شما ، من میرم این رو تست کنم . بازم ممنونم !

Mahmoud.Afrad
دوشنبه 30 بهمن 1391, 12:52 عصر
کافیه foreach را به for تبدیل کنید:

DataTable dt = new DataTable();
for (int i = 0; i < radGridView1.Columns.Count; i++)
{
dt.Columns.Add(radGridView1.Columns[i].Name);
}
for (int j = 0; j < radGridView1.Rows.Count; j++)
{
dt.Rows.Add();
for (int k = 0; k < radGridView1.Columns.Count; k++)
{
dt.Rows[j][k] = radGridView1.Rows[j].Cells[k].Value;
}
}

NasimBamdad
پنج شنبه 03 اسفند 1391, 16:54 عصر
دوستان از این کد استفاده کردم ،

DataTable dt = new DataTable();
for (int i = 0; i < dataGridView1.Columns.Count; i++)
{
dt.Columns.Add(dataGridView1.Columns[i].Name);
}
for (int j = 0; j < dataGridView1.Rows.Count; j++)
{
dt.Rows.Add();
for (int k = 0; k < dataGridView1.Columns.Count; k++)
{
dt.Rows[j][k] = dataGridView1.Rows[j].Cells[k].Value;
}
}

string path = "Reports\\List_Jarahi.mrt";
stiReport1.Load(path);
stiReport1.ResetRenderedState();
DataSet ds = new DataSet();
dt.TableName = "Source";
ds.Tables.Add(dt);
stiReport1.Dictionary.Clear();
stiReport1.RegData(ds);
stiReport1.Dictionary.Synchronize();
stiReport1.Show();


متاسفانه تمام رکورد های RadGrid رو منتقل کرد ، چون RadGrid میاد رکورد ها رو بعد از فیلتر کردن Hide می کنه و در نتیجه وجود دارن ،اما ما نمی بینیمشون .

اگه بشه راه حلی برای این کار پیدا کرد خیلی خوب میشه ! یعنی زمانی که من فیلتر می کنم ، اصلا تاثیری نداره !


اینم لیـــــــنـــــــــــک DLL های Telerik Rad Grid View (http://www.4shared.com/rar/hHgHFlLf/dll.html?)

mehdi zanjani
پنج شنبه 03 اسفند 1391, 22:47 عصر
خب معلومه که همچین مشکلی پیش میاد چرا خودت فیلترو نمی نویسی؟؟؟

NasimBamdad
شنبه 05 اسفند 1391, 09:11 صبح
خب معلومه که همچین مشکلی پیش میاد چرا خودت فیلترو نمی نویسی؟؟؟

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

NasimBamdad
سه شنبه 08 اسفند 1391, 13:59 عصر
نظری نیست ؟

tooraj_azizi_1035
سه شنبه 08 اسفند 1391, 14:14 عصر
باید با متد CopyToDataTable این کار رو بکنی:


Private Function GetFilteredDataSource() As DataTable
Dim DT As New DataTable()
Dim FilteredDT As New DataTable()
Dim filterexpression As String = String.Empty
filterexpression = RadGrid1.MasterTableView.FilterExpression
DT = DirectCast(RadGrid1.DataSource, DataTable)
FilteredDT = DT.AsEnumerable..Where(filterexpression).CopyToDat aTable
Return FilteredDT
End Function




ببخشید با VB قرار دادم.

NasimBamdad
چهارشنبه 09 اسفند 1391, 15:10 عصر
باید با متد CopyToDataTable این کار رو بکنی:


Private Function GetFilteredDataSource() As DataTable
Dim DT As New DataTable()
Dim FilteredDT As New DataTable()
Dim filterexpression As String = String.Empty
filterexpression = RadGrid1.MasterTableView.FilterExpression
DT = DirectCast(RadGrid1.DataSource, DataTable)
FilteredDT = DT.AsEnumerable..Where(filterexpression).CopyToDat aTable
Return FilteredDT
End Function




ببخشید با VB قرار دادم.

میشه معادل C# رو قرار بدید ؟


DataTable DT = new DataTable();
DataTable FilteredDT = new DataTable();
string filterexpression = string.Empty;
filterexpression = dataGridView1.MasterTableView.FilterExpression;
DT = DirectCast(dataGridView1.DataSource, DataTable);
FilteredDT = DT.A<b>sEnumerable..Where(filterexpression).CopyToDataTab le</b>
Return FilteredDT;


اینطوریه ؟