PDA

View Full Version : تبدیل دیتاگریدویو به datatable



Maryam IT
دوشنبه 27 مرداد 1393, 12:43 عصر
سلام
من یه دیتاگریدویو دارم که توسط کاربر پر میشه بعد یه سری نتایج توی تعدادی از ستونهای همون دیتاگریدویو برمیگرده( که readonly هستند.)
میخوام چندتا ستون این دیتاگریدویو نهایی رو تبدیل کنم به یه datatable! و بعدش یه چارت با او بکشم!اینم بگم که گریدویوم 19 تا ستون داره!
خودم یه کد نوشتم ولی دقیق نمیدونم درسته یانه چون از اینترنت گرفتم و یه چارت خالی بر میگردونه!!!
اگه کسی میتونه کمک کنه




namespace prj
{
public partial class Time_chart_Form : Form
{
private DataGridView DGV;
public Time_chart_Form(DataGridView DGV)
{
InitializeComponent();
this.DGV = DGV;
}


private void Time_chart_Form_Load(object sender, EventArgs e)
{




using (DataTable table = new DataTable("MyTable"))
{


DataRow newRow;


table.Columns.Add(new DataColumn("Time", typeof(string)));


table.Columns.Add(new DataColumn("Concentration", typeof(string)));






int column;


for (int i = 0; i < this.DGV.Rows.Count; i++)
{


column = 0;


newRow = table.NewRow();


if (!this.DGV[column, i].FormattedValue.Equals(""))


newRow["Time"] = this.DGV[0, i].Value.ToString();


else


newRow["Time"] = null;


column = 16;


if (!this.DGV[16, i].FormattedValue.Equals(""))


newRow["Concentration"] = this.DGV[column, i].Value.ToString();


else


newRow["Concentration"] = null;


table.Rows.Add(newRow);


}










Chart chart = new Chart();






chart.Width = 1600;
chart.Height = 900;


Series Series = new Series();
Series.Name = "Series";


Series.Color = Color.Red;


Series.BorderColor = Color.FromArgb(255, 0, 0);
Series.ChartType = SeriesChartType.Point;


Series.BorderDashStyle = ChartDashStyle.Solid;
//Series.BorderWidth = 10000;




Series.ShadowColor = Color.FromArgb(128, 128, 128);
Series.ShadowOffset = 0;


Series.BorderColor = Color.FromArgb(0, 0, 0);






//Chart Area-------------------------


ChartArea ca1 = new ChartArea();
ca1.Name = "ChartArea";
ca1.BackColor = Color.White;
ca1.BorderColor = Color.FromArgb(255, 255, 255);
ca1.BorderWidth = 10;
ca1.BorderDashStyle = ChartDashStyle.Solid;
ca1.AxisX = new Axis();
ca1.AxisY = new Axis();


chart.BackColor = Color.FromArgb(255, 255, 255);
chart.BackSecondaryColor = Color.White;
chart.BackGradientStyle = GradientStyle.TopBottom;
ca1.BackColor = System.Drawing.Color.FromArgb(64, System.Drawing.Color.White);


chart.ChartAreas.Add(ca1);




chart.Series.Add(Series);


chart.Series["Series"].BorderWidth = 500;






chart.Series["Series"].Points.DataBindXY(table.DefaultView, DGV.Columns[0].Name, table.DefaultView, DGV.Columns[16].Name);




chart.ChartAreas[0].AxisY.Minimum = -6;
chart.ChartAreas[0].AxisY.Maximum = 6;
chart.ChartAreas[0].AxisX.Minimum = 0;
chart.ChartAreas[0].AxisX.Maximum = 10;
chart.ChartAreas[0].AxisX.Interval = 1;
chart.ChartAreas[0].AxisY.Interval = 1;


chart.Titles.Add(new Title("OverView Plot", Docking.Top, new Font("Verdana", 19.5f, FontStyle.Bold), Color.Black));




chart.ChartAreas[0].AxisY.Title = "Time";
chart.ChartAreas[0].AxisX.Title = "Concentration";


chart.ChartAreas[0].AxisX.TitleFont = new System.Drawing.Font("Verdana", 19, FontStyle.Bold);
chart.ChartAreas[0].AxisY.TitleFont = new System.Drawing.Font("Verdana", 19, FontStyle.Bold);




chart.ChartAreas[0].AxisX.LabelStyle.Font = new System.Drawing.Font("Verdana", 19.25f, System.Drawing.FontStyle.Bold);
chart.ChartAreas[0].AxisY.LabelStyle.Font = new System.Drawing.Font("Verdana", 19.25f, System.Drawing.FontStyle.Bold);










chart.SaveImage(@"C:\Users\folder\Documents\Visual Studio 2010\prjchart" + (0).ToString() + ".png", ChartImageFormat.Png);


//table.Clear();






}
}


}


}

Maryam IT
دوشنبه 27 مرداد 1393, 17:55 عصر
:متفکر::متفکر::متفکر:

pesare
دوشنبه 27 مرداد 1393, 18:14 عصر
این کد و یه امتحان کن


DataTable dt = (DataTable)dataGridView1.DataSource;

اسماعیل ابراهیمی
دوشنبه 27 مرداد 1393, 21:25 عصر
من از این کد برای تندیل دیتاگریدم به دیتا تیبل استفاده کردم

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


private DataTable CreateSortedDatatable()
{
DataTable dt = new DataTable();
dt.Columns.Add("transport_id");
dt.Columns.Add("transport_type");
dt.Columns.Add("peyment_type");
dt.Columns.Add("company_id");
dt.Columns.Add("company_name");
dt.Columns.Add("city_id");
dt.Columns.Add("city_name");
dt.Columns.Add("transport_number");
dt.Columns.Add("transport_date");
dt.Columns.Add("transport_weight");
dt.Columns.Add("transport_total_price");
dt.Columns.Add("transport_price");
dt.Columns.Add("agency_portion");
dt.Columns.Add("transport_description");
dt.Columns.Add("is_city_agency");
dt.Columns.Add("current_agency_portion_price");



foreach (DataGridViewRow row in dgv_transport.Rows)
{
DataRow dRow = dt.NewRow();
foreach (DataGridViewCell cell in row.Cells)
{


if (cell.ColumnIndex == 10 || cell.ColumnIndex == 11 || cell.ColumnIndex == 12)
{
dRow[cell.ColumnIndex] =special_class.ToFormattedThousands(cell.Value.ToS tring());
}
else
{
dRow[cell.ColumnIndex] = cell.Value;
}
}
dt.Rows.Add(dRow);
}
return dt;
}


موفق باشی

rezaei_y
دوشنبه 27 مرداد 1393, 21:47 عصر
با سلام

میتونید از این متد استفاده نمایید


public static DataTable ToDataTable(this DataGridView dataGridView)
{

DataGridView dgvTest = dataGridView;
DataTable table = new DataTable();


for (int iCol = 0; iCol < dgvTest.Columns.Count; iCol++)
{
table.Columns.Add(dgvTest.Columns[iCol].Name);
}


foreach (DataGridViewRow row in dgvTest.Rows)
{

DataRow datarw = table.NewRow();

for (int iCol = 0; iCol < dgvTest.Columns.Count; iCol++)
{
datarw[iCol] = row.Cells[iCol].Value;
}

table.Rows.Add(datarw);
}

return table;
}


نحوه استفاده اش هم به اینصورته:

DataTable dt=dgv.ToDataTable();
dgv اسم گرید ویو شماست

Maryam IT
چهارشنبه 29 مرداد 1393, 00:03 صبح
با سلام

میتونید از این متد استفاده نمایید


public static DataTable ToDataTable(this DataGridView dataGridView)
{

DataGridView dgvTest = dataGridView;
DataTable table = new DataTable();


for (int iCol = 0; iCol < dgvTest.Columns.Count; iCol++)
{
table.Columns.Add(dgvTest.Columns[iCol].Name);
}


foreach (DataGridViewRow row in dgvTest.Rows)
{

DataRow datarw = table.NewRow();

for (int iCol = 0; iCol < dgvTest.Columns.Count; iCol++)
{
datarw[iCol] = row.Cells[iCol].Value;
}

table.Rows.Add(datarw);
}

return table;
}


نحوه استفاده اش هم به اینصورته:

DataTable dt=dgv.ToDataTable();
dgv اسم گرید ویو شماست


ببخشید ولی وقتی میخوام از متد اسفاده کنم یعنی مینویسم : DataTable dt=dgv.ToDataTable();
به ToDataTable خطا میگیره! چرا؟

rezaei_y
چهارشنبه 29 مرداد 1393, 00:23 صبح
کد تون رو قرار بدید

متد حتما باید به صورت static تعریف بشه

همچنین میتونید this رو بردارید و static رو حذف کنید و مثل یک تابع معمولی باهاش برخورد کنید در این حالت
DataTable dt=ToDataTable(dgv);

esafb52
چهارشنبه 29 مرداد 1393, 00:30 صبح
سلام این لینک رو ببینیک کد جالب و کوتاه داخلش هست http://stackoverflow.com/questions/6295161/how-to-build-a-datatable-from-a-datagridview