View Full Version : رسم منحنی با استفاده از ابزار استیمول
programerinfonet
دوشنبه 29 آبان 1391, 16:40 عصر
سلام دوستان :
من تو برنامم نتیجه ی دستور سلکت رو تو دیتاگرید نشون میدم
حالا میخوام وقتی کاربر رو دکمه ی چاپ کلیک کرد کنترل دیتاگرید به ابزار استیمول ارسال بشه جهت چاپ و همچنین یک نمودار از داده های دیتاگرید تو همون استیمول رسم بشه
لطفأ کمکم کنید
خیلی ممنون
veniz2008
دوشنبه 29 آبان 1391, 19:30 عصر
سلام.
برای نمایش داده های گرید، همون منبع رو که به گرید دادید ( دیتاتیبل، دیتا ست یا ...) برای استیمول بفرستید.در محیط استیمول یک دیتاسورس بسازید و ستون های مورد نیازتون رو واسه این دیتاسورس تشکیل بدید. یک کنترل data رو فرم بندازید (بقیه مراحل هم قبلا در سایت توضیح داده شدن). برای رسم نمودار هم از سمت چپ استیمول قسمت پایین، دو تا فلش کوچیک کنار هم وجود داره. از اونجا گزینه چارت رو انتخاب کن. مراحل انجام کار ساده است. بعد از انتخاب نوع نمودار ( میله ای، دایره ای یا ...) مراحل رو طبق 2 شکل زیر انجام بدید.
توجه داشته باشید که اگر بخواید چند مورد رو با هم مقایسه کنید(مثلا اطلاعات دو دیتاتیبل رو با هم مقایسه کنید) باید چند سری اضافه کنید ولی اگر فقط قراره از یه دیتاسورس بخونید یه سری اضافه کنید.
مقدار Argument data column رو با چیزی که میخواید روی محور مختصات باشه ( مثلا نام درس برای شکل زیر) و مقدار Value data column رو هم با مقدار (یعنی نمره درس برای شکل زیر) مقدار دهی کنید.
95250
95251http://barnamenevis.org/images/misc/pencil.png
programerinfonet
پنج شنبه 02 آذر 1391, 12:52 عصر
دوست عزیز اگه میشه یک مثال کاربردی واسم بزنید
نتونستم
veniz2008
پنج شنبه 02 آذر 1391, 15:55 عصر
با شکل های مختلف سعی میکنم مطلب رو واستون توضیح بدم:
بعد از اضافه کردن یک شی stiReport به فرم، روی آن راست کلیک کنید و گزینه Design Report رو انتخاب کنید. بعد از وارد شدن به محیط طراحی، طبق شکل زیر یک datasource ایجاد کنید:
95419
95420
نام دیتاسورس ( Name in Source ) رو برابر با نام دیتاتیبلی که در سی شارپ دارید قرار بدید و به تعداد فیلدهای درون دیتاتیبل ستون ایجاد کنید و نام و نوع هر ستون رو طبق دیتاتیبل خودتون تنظیم کنید. شکل زیر رو توجه کنید:
95422
95423http://barnamenevis.org/images/misc/pencil.png
veniz2008
پنج شنبه 02 آذر 1391, 16:00 عصر
به دلیل اینکه در هر پست بیشتر از 5 عکس نمیشه قرار داد، ناچارا در 3 پست متوالی مطلب رو توضیح میدم.
برای ایجاد یک عنوان برای بالای هر صفحه گزارش میتونید از گزینه page header استفاده کنید. برای قرار دادن متن هم از شی Text استفاده می کنیم. برای قرار دادن عناوین هر فیلد ، مثل نام یا شماره شناسنامه یا تلفن، یک شی Header به فرم اضافه کنید و به تعداد فیلدها تون شی Text به درون Header اضافه کنید. با دابل کلیک کردن روی هر Text، عنوان فیلد رو تایپ کنید. شکل رو ببینید :
95425
95426
برای گرفتن مقادیر متناظر با هر عنوان یک شی Data به فرم اضافه کنید( در واقع این کار همون نسبت دادن دیتاتیبلی هست که از سی شارپ فرستادید) . طبق شکل، بعد از اضافه کردن data ، ابتدا بر روی مربع آبی رنگ کلیک و Datasource خودتون رو انتخاب کنید :
95429
حالا در سمت راست هر Text ، یک مربع آبی رنگ وجود داره که اگه بر روی اون کلیک کنید، لیست همه فیلدهای شما رو نشون میده. برای هر Text ، فیلد مناسب رو انتخاب کنید:
95430http://barnamenevis.org/images/misc/pencil.png
veniz2008
پنج شنبه 02 آذر 1391, 16:02 عصر
بعد از انجام این مراحل، ابتدا بر روی دکمه Save ( آیکن فلاپی ) کلیک کنید و بعد از منوی File گزینه Save Report As رو بزنید و فایل گزارش رو که با پسوند mrt هست درون پوشه bin\debug یعنی کنار فایل اجرایی پروژه ذخیره کنید. ( نامی که هنگام ذخیره شدن میزارید درون محیط سی شارپ هم همین نام رو باید به همراه پسوند اون ذکر کنید. کدها رو در ادامه میزارم تا بهتر متوجه منظورم بشید) :
95433
95435
95434
حالا درون سی شارپ و درون دکمه ای که قراره گزارش رو صادر کنی کدهای زیر رو بنویس :
منظور از DtDate همون دیتاتیبل شما هست. همین نام رو باید در هنگام ساخت دیتاسورس در استیمول هم بذارید. منظور از StiReportProject نامی هست که برای فایل گزارش در نظر گرفتم.
if (DtDate.Rows.Count == 0)
MessageBox.Show("هیچ موردی یافت نشد");
else
{
stiReport1.Load("StiReportProject.mrt");
stiReport1.RegData(DtDate);
stiReport1.Show();
}
موفق باشید.
masoodz
پنج شنبه 02 آذر 1391, 18:16 عصر
دوست من سلام
من این سوالو تو چند تا تاپیک زدم ولی جواب خوبی نگرفتم : من یه دستور select دارم که بر اساس یه مقدار که از تکست باکس میگیره تو دیتابیس select میکنه و حالا می خوام نتیجه این سلکت رو توی استیمول بندازم باید چیکار کنم ؟ یعنی از همین روشی که گفتی میشه اینکارو انجام داد ؟
ببخشید ممکنه سوالم پیش پا افتاده باشه ولی خیلی لازمش دارم
programerinfonet
پنج شنبه 02 آذر 1391, 18:23 عصر
البته برای من هم این سوال وجود داره
البته با این تفاوت که من نتیجه ی سلکت رو تو دیتاگرید نشون میدم و میخوام با زدن دکمه ی چاپ گرید به استیمول فرستاده بشه و موضوعه دیگری که هست این جستجو طوری هست که مشخص نمی کنه که دیتاگرید چند تا ستون (فیلد) داره
حالا باید چی کار کنم
veniz2008
پنج شنبه 02 آذر 1391, 23:57 عصر
دوست من سلام
من این سوالو تو چند تا تاپیک زدم ولی جواب خوبی نگرفتم : من یه دستور select دارم که بر اساس یه مقدار که از تکست باکس میگیره تو دیتابیس select میکنه و حالا می خوام نتیجه این سلکت رو توی استیمول بندازم باید چیکار کنم ؟ یعنی از همین روشی که گفتی میشه اینکارو انجام داد ؟
ببخشید ممکنه سوالم پیش پا افتاده باشه ولی خیلی لازمش دارم
بله با همین روش براحتی میتونید این کار رو انجام بدید. مهم نیست که از یک تکست باکس یا چند تکست باکس یا از کمبو باشه یا هر چیز دیگه. مهم اینه که دیتاتیبلی رو که بدست میاری به استیمول بدی. دقیقا مثل همین چیزی که واستون گذاشتم.
البته برای من هم این سوال وجود داره
البته با این تفاوت که من نتیجه ی سلکت رو تو دیتاگرید نشون میدم و میخوام با زدن دکمه ی چاپ گرید به استیمول فرستاده بشه و موضوعه دیگری که هست این جستجو طوری هست که مشخص نمی کنه که دیتاگرید چند تا ستون (فیلد) داره
حالا باید چی کار کنم
شما یه دیتاتیبل داری که اونو به خاصیت datasource گرید ربط دادی، حالا همون دیتاتیبل رو به استیمول بدید، واسه خود من واقعا این سوال شده که کجای این کار مبهمه؟. مطلب مثل روز روشنه!. ولی با این وجود هر جایی رو سوال دارید بپرسید تا توضیح بدم.
در مورد بخش دوم سوالتون، یعنی چی؟. دستور select ای که مینویسید به چه صورت هست؟. مگر تعداد فیلدهایی رو که برمیگردونه مشخص نیست؟. در این مورد بیشتر توضیح بدید.
programerinfonet
جمعه 03 آذر 1391, 09:50 صبح
نه دوست عزیز درستش کردم
جوری شد که در هر جستجو تعداد فیلدهارو ثابت کردم
masoodz
جمعه 03 آذر 1391, 12:07 عصر
دوست من تو قطعه کدی که زدی با با خط stireport1.regdata مشکل دارم . مگه نباید اسم دیتا تیبل رو توش بریزم ؟ اینکارو می کنم قبول نمیکنه . میشه یه راهنمایی کنی ؟
if (DtDate.Rows.Count == 0)
MessageBox.Show("هیچ موردی یافت نشد");
else
{
stiReport1.Load("StiReportProject.mrt");
این خط منظورمه //stiReport1.RegData(DtDate);
stiReport1.Show();
}
veniz2008
جمعه 03 آذر 1391, 13:21 عصر
بله باید دیتاتیبل یا دیتاست خودتون رو بهش بدید. اگر ممکنه کدتون رو بصورت کامل بذارید تا یه نگاه بهش بندازم.
masoodz
جمعه 03 آذر 1391, 18:18 عصر
این از کدم . واقعا بتونی مشکلمو حل کنی کمک خیلی بزرگی بهم کردی . این اولین برنامه بزرگی هست که دارم می نویسم . می خوام به سایت برنامه نویس تقدیمش کنم چون واقعا خیلی کمکم کرده
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.Data.SqlTypes;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
SqlConnection c = new SqlConnection("server=MASOUD-03357D6F\\SQLEXPRESS;database=isp;integrated security=true");
DataSet ds = new DataSet();
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
SqlDataAdapter s = new SqlDataAdapter("Select * from gharardad",c);
s.Fill(ds);
DataTable masoud;
masoud = ds.Tables.Add("masoud");
masoud.Columns.Add("name",typeof(System.String));
masoud.Columns.Add("family", typeof(System.String));
s.Fill(ds.Tables["masoud"]);
}
private void button1_Click(object sender, EventArgs e)
{
stiReport1.Load("stiReport1.mrt");
stiReport1.Dictionary.Databases.Clear();
stiReport1.Dictionary.DataSources.Clear();
stiReport1.RegData(masoud);
stiReport1.Show();
}
}
}
veniz2008
جمعه 03 آذر 1391, 18:39 عصر
ببینید چرا اینقدر خودتون رو اذیت می کنید و کوئری های پیچ در پیچ مینویسید؟. یه توصیه بهتون میکنم زمانیکه فقط با با یه جدول سر و کار دارید از دیتاست استفاده نکنید. در کدی شما که گذاشتی دیتاتیبل رو new نکردید. چرا مستقیم کوئری رو نمی نویسید؟. شما اومدی یه دیتاتیبل به دیتاست اضافه کردی و بعد اومدی ستون به دیتاتیبل اضافه کردی و دو ستون از دیتاست رو به دیتاتیبل انتقال دادی. فقط با این کار خودتون رو اذیت می کنید.
veniz2008
جمعه 03 آذر 1391, 19:01 عصر
اگه از اون جدول gharardad فقط name و family رو میخوای نمایش بدی بصورت زیر استفاده کنید. دیگه خودتون تعداد فیلدهای مورد نیازتون رو بنویسید.
private void Form1_Load(object sender, EventArgs e)
{
SqlDataAdapter s = new SqlDataAdapter("Select name,family from gharardad",c);
DataTable masoud = new DataTable;
s.Fill(masoud);
}
private void button1_Click(object sender, EventArgs e)
{
stiReport1.Load("stiReport1.mrt");
stiReport1.RegData(masoud);
stiReport1.Show();
}
موفق باشید.
masoodz
جمعه 03 آذر 1391, 22:32 عصر
مرسی محمد جان . دست گلت درد نکنه :بوس:
یه سوال دیگه : این دیتا تیبل هایی که می سازم باعث کاهش سرعت برنامه نمیشه ؟
veniz2008
شنبه 04 آذر 1391, 02:16 صبح
یه سوال دیگه : این دیتا تیبل هایی که می سازم باعث کاهش سرعت برنامه نمیشه ؟
دیتاتیبل و دیتاست درون رم قرار میگیرن واسه همین سرعت اجرا و کار کردن باهاشون زیاده و از این بابت جای نگرانی نیست. تنها نکته ای که باید رعایت کنید سبک کدنویسی هستش ( هم دستور sql و هم دستورات سی شارپ). مثلا مثل حالت اولی که خودتون نوشتید صحیح نیست. چون چندین مرحله کار تکراری و اضافی انجام داده بودید که زمانیکه تعداد رکوردها برای گزارش گیری زیاد باشن، سرعت کند میشه.
موفق باشی دوست من.
hasanshamim
جمعه 27 دی 1392, 14:20 عصر
تو asp.net باید چیکار کرد. من از این روش استفاده کردم که اول یک StiWebViewer انداختم توی فرمم و با استفاده از کلاس StiReport یک آبجکت ساختم و بقیه کد ها در زیر نوشتم ولی فک کنم اشتباه باشه. لطفا راهنماییم کنید.
string server = HttpContext.Current.Server.MapPath(string.Empty);
StiReport mystireport = new StiReport();
mystireport.Load(server + "\\Report\\TestReport.mrt");
mystireport.RegData(spSelectAddFishPrint2);
StiWebViewer1.Report = mystireport;
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.