PDA

View Full Version : چاپ اطلاعات datagridview با چند روش و اجرا نشدن دستورات



vB.N3T
شنبه 24 بهمن 1394, 09:24 صبح
سلام
دوستان یه دیتاگرید دارم که اطلاعات چند فیلدش به صورت دستی وارد شده و چند فیلد دیگه از بانک
حالا من میخام اطلاعات این دیتاگرید رو به استیمول پاس اما نمیشه
از این چند نوع کد هم استفاده کردم
ممنون میشم کمک کنید

private void button2_Click_1(object sender, EventArgs e)
{
DataTable table = new DataTable("Db_FoctorKhered");
foreach (DataGridViewColumn column in dataGridView1.Columns)
{
table.Columns.Add(column.Name, typeof(string));
}
for (int i = 0; i < dataGridView1.Rows.Count; i++)
{
table.Rows.Add();
for (int j = 0; j < dataGridView1.Columns.Count; j++)
{
table.Rows[i][j] = dataGridView1[j, i].Value;
}
}
DataSet ds = new DataSet();
ds.Tables.Add(table);
StiReport report = new StiReport();
folderBrowserDialog1.SelectedPath = Application.StartupPath;
string select_root_report = folderBrowserDialog1.SelectedPath;
report.Load(select_root_report + "\\test2_222.mrt");
report.RegData(table);
StiOptions.Viewer.Windows.ShowPageDesignButton = false;
StiOptions.Viewer.Windows.ShowOpenButton = false;
//stiReport.Design();
report.Show();
}
}

private void button1_Click(object sender, EventArgs e)
{
StiReport report = new StiReport();
folderBrowserDialog1.SelectedPath = Application.StartupPath;
string select_root_report = folderBrowserDialog1.SelectedPath;
report.Load(select_root_report + "\\test2_222.mrt");
report.RegData("DataSource3", dataGridView1.DataSource);
report.Show();
}




private void ambiance_Button_12_Click(object sender, EventArgs e)
{
DataTable table = new DataTable();

table.Columns.Add("name");
table.Columns.Add("date");
table.Columns.Add("vaziat");
table.Columns.Add("price");


foreach (DataGridViewRow dgv in dataGridView1.Rows)
{
table.Rows.Add(dgv.Cells[0].Value,
dgv.Cells[1].Value,
dgv.Cells[2].Value,
dgv.Cells[3].Value

);
}

StiReport reporrt = new StiReport();
folderBrowserDialog1.SelectedPath = Application.StartupPath;
string select_root_report = folderBrowserDialog1.SelectedPath;
reporrt.Load(select_root_report + "\\test2_222.mrt");
reporrt.RegData("DataSource3",table);
reporrt.Show();




}

ژیار رحیمی
شنبه 24 بهمن 1394, 13:47 عصر
سلام وقتی DataSource دیتاگرید رو پاس میکنی فقط انچه به عنوان DataSource به دیتاگرید انتساب دادی فرستاده میشود.شما ممکنه DataSource شما دارای دو ستون باشه ولی دیتاگرید شما چهارستون داشته باشه یعنی دو ستون غیر یایند شده داشته باشی.برای اینکار شما میتونی مجدد از روی DataGrid یه دیتاسورس به شکل DataTable یا یه فایل Xml هر کدومش که راحتی بسازی ،بعد DataSource ساخته شده رو به Stimul پاس کنی. یه نمونه کد زیر ساختن DataTable از روی ستون و سطر های دیتاگرید هست

public DataTable GetContentAsDataTable(bool IgnoreHideColumns=false)
{
try
{
if (dgv.ColumnCount == 0) return null;
DataTable dtSource = new DataTable();
foreach (DataGridViewColumn col in dgv.Columns)
{
if (IgnoreHideColumns & !col.Visible) continue;
if (col.Name == string.Empty) continue;
dtSource.Columns.Add(col.Name, col.ValueType);
dtSource.Columns[col.Name].Caption = col.HeaderText;
}
if (dtSource.Columns.Count == 0) return null;
foreach (DataGridViewRow row in dgv.Rows)
{
DataRow drNewRow = dtSource.NewRow();
foreach (DataColumn col in dtSource .Columns)
{
drNewRow[col.ColumnName] = row.Cells[col.ColumnName].Value;
}
dtSource.Rows.Add(drNewRow);
}
return dtSource;
}
catch { return null; }
}



منبع کد stackoverflow (http://stackoverflow.com/questions/6295161/how-to-build-a-datatable-from-a-datagridview)

mhsmity
یک شنبه 25 بهمن 1394, 03:51 صبح
سلام
style ستون ها و سطرها چطور باید ارسال گردد
جنابعالی با این کار داده هارو ارسال کردید درسته ولی اگه به خصوصیات بیشتر از دیتا گرید ویو نیاز داشتم چه کار باید کرد؟

ژیار رحیمی
یک شنبه 25 بهمن 1394, 04:48 صبح
سلام
style ستون ها و سطرها چطور باید ارسال گردد
جنابعالی با این کار داده هارو ارسال کردید درسته ولی اگه به خصوصیات بیشتر از دیتا گرید ویو نیاز داشتم چه کار باید کرد؟

آنچه شما به Stimul میفرستی DataSource هست (داده خام) برای ارسال Style به نظر من میتونی از پارامتر استفاده کنی و در مقصد با توجه به پارامتر(های) ارسالی، Style رو روی Table موجود در Stimul پیاده سازی کنی.اگر Style گرید مهمه و حتما باید در خروجی به همان صورت چاپ بشه. به پیشنهاد من از گرید شرکتTelerik استفاده کن البته RadGridView رو با Framework داخلی خودش چاپ کنی نه با Stimul

vB.N3T
یک شنبه 25 بهمن 1394, 06:58 صبح
سلام وقتی DataSource دیتاگرید رو پاس میکنی فقط انچه به عنوان DataSource به دیتاگرید انتساب دادی فرستاده میشود.شما ممکنه DataSource شما دارای دو ستون باشه ولی دیتاگرید شما چهارستون داشته باشه یعنی دو ستون غیر یایند شده داشته باشی.برای اینکار شما میتونی مجدد از روی DataGrid یه دیتاسورس به شکل DataTable یا یه فایل Xml هر کدومش که راحتی بسازی ،بعد DataSource ساخته شده رو به Stimul پاس کنی. یه نمونه کد زیر ساختن DataTable از روی ستون و سطر های دیتاگرید هست

public DataTable GetContentAsDataTable(bool IgnoreHideColumns=false)
{
try
{
if (dgv.ColumnCount == 0) return null;
DataTable dtSource = new DataTable();
foreach (DataGridViewColumn col in dgv.Columns)
{
if (IgnoreHideColumns & !col.Visible) continue;
if (col.Name == string.Empty) continue;
dtSource.Columns.Add(col.Name, col.ValueType);
dtSource.Columns[col.Name].Caption = col.HeaderText;
}
if (dtSource.Columns.Count == 0) return null;
foreach (DataGridViewRow row in dgv.Rows)
{
DataRow drNewRow = dtSource.NewRow();
foreach (DataColumn col in dtSource .Columns)
{
drNewRow[col.ColumnName] = row.Cells[col.ColumnName].Value;
}
dtSource.Rows.Add(drNewRow);
}
return dtSource;
}
catch { return null; }
}



منبع کد stackoverflow (http://stackoverflow.com/questions/6295161/how-to-build-a-datatable-from-a-datagridview)

جناب رحیمی از این تابع باید چطور استفاده کرد

ژیار رحیمی
یک شنبه 25 بهمن 1394, 07:12 صبح
در کد یه دیتاگرید به نام dgv وجود دارد شما میتونی تابع رو به کلاس Form خودت اضافه کنی و با تغییر dgv به نام دیتاگرید خودت ازش استفاده کنی.یا میتونی یه آراگومان از نوع دیتاگرید به تابع اضافه کنی که در این حالت میتونی برای دیتاگریدهای مختلف ازش استفاده کرد.

public DataTable GetContentAsDataTable(DataGridView dgv,bool IgnoreHideColumns=false)
{
try
{
if (dgv == null) return null;
if (dgv.ColumnCount == 0) return null;
DataTable dtSource = new DataTable();
foreach (DataGridViewColumn col in dgv.Columns)
{
if (IgnoreHideColumns & !col.Visible) continue;
if (col.Name == string.Empty) continue;
dtSource.Columns.Add(col.Name, col.ValueType);
dtSource.Columns[col.Name].Caption = col.HeaderText;
}
if (dtSource.Columns.Count == 0) return null;
foreach (DataGridViewRow row in dgv.Rows)
{
DataRow drNewRow = dtSource.NewRow();
foreach (DataColumn col in dtSource .Columns)
{
drNewRow[col.ColumnName] = row.Cells[col.ColumnName].Value;
}
dtSource.Rows.Add(drNewRow);
}
return dtSource;
}
catch { return null; }
}

نحوه استفاده با استفاده از کد بالا

private void button1_Click(object sender, EventArgs e)
{
StiReport report = new StiReport();
folderBrowserDialog1.SelectedPath = Application.StartupPath;
string select_root_report = folderBrowserDialog1.SelectedPath;
report.Load(select_root_report + "\\test2_222.mrt");
var dt=GetContentAsDataTable(dataGridView1);
report.RegData("DataSource3", dt);
report.Show();
}

hadimtn
دوشنبه 26 بهمن 1394, 03:43 صبح
در کد یه دیتاگرید به نام dgv وجود دارد شما میتونی تابع رو به کلاس Form خودت اضافه کنی و با تغییر dgv به نام دیتاگرید خودت ازش استفاده کنی.یا میتونی یه آراگومان از نوع دیتاگرید به تابع اضافه کنی که در این حالت میتونی برای دیتاگریدهای مختلف ازش استفاده کرد.


سلام.
من از این روش استفاده کردم ولی با صفحه ی خالی روبرو میشم.
تنها تغییری که دادم در خط 13 به جای col.HeaderText از col.Name استفاده کردم که دقیقاً نام ستون های جدول رو اختصاص بده.
توی Data Source استیمول هم دقیقاً نام ستون های دیتاگرید رو وارد کردم.


public void RegData(StiReport report)
{
var dt = GetContentAsDataTable(buyListViewer_DataGridView);
report.RegData("DataSource1", dt);
}


و


private void btn_Print_Click(object sender, EventArgs e)
{
StiReport report = new StiReport();
report.Load("BuyListReport.mrt");
var dt = GetContentAsDataTable(buyListViewer_DataGridView);
report.RegData("DataSource1", dt);
report.Show();
}

ژیار رحیمی
دوشنبه 26 بهمن 1394, 07:19 صبح
تست کردم (جواب داد)مشکلی نداشت فقط در تابع تبدیل بجای

dtSource.Columns.Add(col.Name, col.ValueType);

به اینصورت اصلاح کن

dtSource.Columns.Add(col.Name);

پراپرتی نام (Name) ستون و DataPropertyName همان ستون هر دو یک نام داشته باشند

vB.N3T
دوشنبه 26 بهمن 1394, 08:20 صبح
جناب رحیمی این مستندات من

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

ژیار رحیمی
دوشنبه 26 بهمن 1394, 08:31 صبح
مشکل از گزارش شماست اگر امکان داره همین نمونه پروژه رو بزارید تا بررسی کنم مشکل از کجاست

ژیار رحیمی
دوشنبه 26 بهمن 1394, 09:51 صبح
این نمونه مثال امیدوارم کارت رو را بندازه

khokhan
دوشنبه 26 بهمن 1394, 10:03 صبح
جناب رحیمی این مستندات من

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

متاسفانه چون دیتاتیبل رو مستقیم به گزارش ارسال کردین فایل گزارشتون آسیب دیده
راه چاره اش اینه که فایل گزارش جدیدی درست کنین و جایگزین قبلی نمایین
و در سمت برنامه ، ابتدا دیتاتیبل رو بریزین داخل یه دیتاست و بعد دیتاست رو بفرستین به گزارش :


var dt = GetContentAsDataTable(dataGridView1);
DataSet rptds = new DataSet();
rptds.Tables.Add(dt);
report.RegData("DataSource3", rptds.Tables[0]);