نمایش نتایج 1 تا 7 از 7

نام تاپیک: خطای گرفتن مقادیر x از نمودار در هنگام حرکت موس

  1. #1

    Exclamation خطای گرفتن مقادیر x از نمودار در هنگام حرکت موس

    سلام یه برنامه دارم که اطلاعات رو روی نمودار نمایش میده قسمت Y عدد و قسمت X تاریخ شمسی هست. وقتی اطلاعات X رو به صورت String وارد نمودار میکنم شکل نمودار درست ولی نمیتونم مقدارشو موقع حرکت موس بدست بیارم چون نوعش String از طرف دیگه وقتی وقتی اطلاعات X رو به صورت DateTime وارد نمودار میکنم شکل نمودار به هم میریزه و به اصطلاح کشیده میشه. دیگه نمیدونم چیکار کنم خواهشا اگر کسی اطلاعی داره بگه چیکار کنم. در ضمن نمودار هم MSChart هست.
    private void chart1_MouseMove(object sender, MouseEventArgs e)    {
    if (ismiddlebuttonclick)
    {
    label_VE.Visible = true;
    label_HO.Visible = true;
    label_VAL.Visible = true;


    label_HO.Location = new Point(76, e.Y);
    label_VE.Location = new Point(e.X, 21);


    if (e.X <= 83 || e.Y >= 435 || e.Y <= 27 || e.X >= 852)
    {
    label_VE.Visible = false;
    label_HO.Visible = false;
    label_VAL.Visible = false;
    }
    else
    {
    label_VE.Visible = true;
    label_HO.Visible = true;
    label_VAL.Visible = true;
    }


    try
    {
    double yValue = chart1.ChartAreas[0].AxisY.PixelPositionToValue(e.Y);
    double xPixel = chart1.ChartAreas[0].AxisX.ValueToPixelPosition(chart1.ChartAreas[0].AxisX.PixelPositionToValue(e.X));
    double xValue = chart1.ChartAreas[0].AxisX.PixelPositionToValue(xPixel);

    label_VAL.Text = string.Concat(Math.Round(yValue, 1).ToString(), " , ", xValue.ToString());
    label_VAL.Location = new Point(863, e.Y - 5);
    }
    catch (Exception ex)
    {
    MessageBox.Show("خطا در نشانگر" + ex.Message, "خطا", MessageBoxButtons.OK, MessageBoxIcon.Error);
    return;
    }
    }
    else
    {
    label_VE.Visible = false;
    label_HO.Visible = false;
    label_VAL.Visible = false;
    return;
    }




    }
    فایل های ضمیمه فایل های ضمیمه
    آخرین ویرایش به وسیله Mahmoud.Afrad : دوشنبه 08 خرداد 1402 در 09:25 صبح

  2. #2
    کاربر دائمی آواتار پرستو پارسایی
    تاریخ عضویت
    آبان 1392
    محل زندگی
    تهران
    پست
    458

    نقل قول: خطای گرفتن مقادیر x از نمودار در هنگام حرکت موس

    نقل قول نوشته شده توسط hamed.re مشاهده تاپیک
    سلام یه برنامه دارم که اطلاعات رو روی نمودار نمایش میده قسمت Y عدد و قسمت X تاریخ شمسی هست. وقتی اطلاعات X رو به صورت String وارد نمودار میکنم شکل نمودار درست ولی نمیتونم مقدارشو موقع حرکت موس بدست بیارم چون نوعش String از طرف دیگه وقتی وقتی اطلاعات X رو به صورت DateTime وارد نمودار میکنم شکل نمودار به هم میریزه و به اصطلاح کشیده میشه. دیگه نمیدونم چیکار کنم خواهشا اگر کسی اطلاعی داره بگه چیکار کنم. در ضمن نمودار هم MSChart هست.

    در مورد مشکلی که در نمودار خود دارید، دلیل آن ممکن است این باشد که شما مقدار X را به عنوان یک رشته String به نمودار می‌دهید در حالی که محور X باید به عنوان یک محور زمانی (DateTime) تعریف شود. به همین دلیل، شکل نمودار شما به هم می‌ریزد. برای رفع احتمالی مشکل در پروژه شما این کد را تست نمائید.
    private void chart1_MouseMove(object sender, MouseEventArgs e)
    {
    if (ismiddlebuttonclick)
    {
    label_VE.Visible = true;
    label_HO.Visible = true;
    label_VAL.Visible = true;


    label_HO.Location = new Point(76, e.Y);
    label_VE.Location = new Point(e.X, 21);


    if (e.X <= 83 || e.Y >= 435 || e.Y <= 27 || e.X >= 852)
    {
    label_VE.Visible = false;
    label_HO.Visible = false;
    label_VAL.Visible = false;
    }
    else
    {
    label_VE.Visible = true;
    label_HO.Visible = true;
    label_VAL.Visible = true;
    }


    try
    {
    double yValue = chart1.ChartAreas[0].AxisY.PixelPositionToValue(e.Y);
    string xString = chart1.Series[0].Points[(int)Math.Round(chart1.ChartAreas[0].AxisX.PixelPositionToValue(e.X))].AxisLabel;
    DateTime xValue = DateTime.ParseExact(xString, "yyyy-MM-dd", CultureInfo.InvariantCulture);
    chart1.Series[0].Points.AddXY(xValue, yValue);
    label_VAL.Text = string.Concat(Math.Round(yValue, 1).ToString(), " , ", xValue.ToString());
    label_VAL.Location = new Point(863, e.Y - 5);
    }
    catch (Exception ex)
    {
    MessageBox.Show("خطا در نشانگر: " + ex.Message, "خطا", MessageBoxButtons.OK, MessageBoxIcon.Error);
    return;
    }
    }
    else
    {
    label_VE.Visible = false;
    label_HO.Visible = false;
    label_VAL.Visible = false;
    return;
    }
    }



  3. #3

    نقل قول: خطای گرفتن مقادیر x از نمودار در هنگام حرکت موس

    نقل قول نوشته شده توسط پرستو پارسایی مشاهده تاپیک
    در مورد مشکلی که در نمودار خود دارید، دلیل آن ممکن است این باشد که شما مقدار X را به عنوان یک رشته String به نمودار می‌دهید در حالی که محور X باید به عنوان یک محور زمانی (DateTime) تعریف شود. به همین دلیل، شکل نمودار شما به هم می‌ریزد. برای رفع احتمالی مشکل در پروژه شما این کد را تست نمائید.
    private void chart1_MouseMove(object sender, MouseEventArgs e)
    {
    if (ismiddlebuttonclick)
    {
    label_VE.Visible = true;
    label_HO.Visible = true;
    label_VAL.Visible = true;


    label_HO.Location = new Point(76, e.Y);
    label_VE.Location = new Point(e.X, 21);


    if (e.X <= 83 || e.Y >= 435 || e.Y <= 27 || e.X >= 852)
    {
    label_VE.Visible = false;
    label_HO.Visible = false;
    label_VAL.Visible = false;
    }
    else
    {
    label_VE.Visible = true;
    label_HO.Visible = true;
    label_VAL.Visible = true;
    }


    try
    {
    double yValue = chart1.ChartAreas[0].AxisY.PixelPositionToValue(e.Y);
    string xString = chart1.Series[0].Points[(int)Math.Round(chart1.ChartAreas[0].AxisX.PixelPositionToValue(e.X))].AxisLabel;
    DateTime xValue = DateTime.ParseExact(xString, "yyyy-MM-dd", CultureInfo.InvariantCulture);
    chart1.Series[0].Points.AddXY(xValue, yValue);
    label_VAL.Text = string.Concat(Math.Round(yValue, 1).ToString(), " , ", xValue.ToString());
    label_VAL.Location = new Point(863, e.Y - 5);
    }
    catch (Exception ex)
    {
    MessageBox.Show("خطا در نشانگر: " + ex.Message, "خطا", MessageBoxButtons.OK, MessageBoxIcon.Error);
    return;
    }
    }
    else
    {
    label_VE.Visible = false;
    label_HO.Visible = false;
    label_VAL.Visible = false;
    return;
    }
    }


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

    private void Draw_chart()
    {
    try
    {
    foreach (DataGridViewColumn column in dataGridView1.Columns)
    {
    column.SortMode = DataGridViewColumnSortMode.NotSortable;
    }


    double xmax = chart1.ChartAreas["ChartArea1"].AxisX.Maximum;


    foreach (DataGridViewRow row in dataGridView1.Rows)
    {
    if (row.Cells[1].Value != null)
    {
    string a = row.Cells[1].Value.ToString();
    string xValue = row.Cells[0].Value.ToString();
    //xValue = xValue.Replace("/", "");
    string yValue = row.Cells[2].Value.ToString();


    string[] dateParts = xValue.Split('/');
    int year = int.Parse(dateParts[0]);
    int month = int.Parse(dateParts[1]);
    int day = int.Parse(dateParts[2]);


    PersianCalendar pc = new PersianCalendar();
    DateTime date = pc.ToDateTime(year, month, day, 0, 0, 0, 0);
    //double x = date.ToOADate();


    string a1 = "ورود نقدینگی";
    string a2 = "خروج نقدینگی";


    if (a == a1)
    {
    chart1.Series["ورود نقدینگی"].Points.AddXY(date, yValue);
    }
    if (a == a2)
    {
    chart1.Series["خروج نقدینگی"].Points.AddXY(date, yValue);
    }
    }
    }


    chart1.ChartAreas["ChartArea1"].AxisX.ScaleView.Zoom(0, xmax);
    }
    catch (Exception ex)
    {
    MessageBox.Show("خطا در هنگام کشیدن نمودار" + ex.Message, "خطا", MessageBoxButtons.OK, MessageBoxIcon.Error);
    this.Close();
    return;
    }
    }
    آخرین ویرایش به وسیله hamed.re : شنبه 06 خرداد 1402 در 18:05 عصر

  4. #4
    کاربر دائمی آواتار پرستو پارسایی
    تاریخ عضویت
    آبان 1392
    محل زندگی
    تهران
    پست
    458

    نقل قول: خطای گرفتن مقادیر x از نمودار در هنگام حرکت موس

    private void DrawChart(){
    try
    {
    foreach (DataGridViewColumn column in dataGridView1.Columns)
    {
    column.SortMode = DataGridViewColumnSortMode.NotSortable;
    }


    double xmax = chart1.ChartAreas["ChartArea1"].AxisX.Maximum;


    foreach (DataGridViewRow row in dataGridView1.Rows)
    {
    if (row.Cells[1].Value != null)
    {
    string a = row.Cells[1].Value.ToString();
    DateTime date = DateTime.Parse(row.Cells[0].Value.ToString());
    double x = date.ToOADate(); // تبدیل تاریخ به عددی قابل استفاده در نمودار
    string yValue = row.Cells[2].Value.ToString();


    // افزودن داده‌ها به سری‌های مربوطه در نمودار
    if (a == "ورود نقدینگی")
    {
    chart1.Series["ورود نقدینگی"].Points.AddXY(x, yValue);
    }
    if (a == "خروج نقدینگی")
    {
    chart1.Series["خروج نقدینگی"].Points.AddXY(x, yValue);
    }
    }
    }


    // اعمال زوم بر روی محور افقی نمودار
    chart1.ChartAreas["ChartArea1"].AxisX.ScaleView.Zoom(0, xmax);
    }
    catch (Exception ex)
    {
    MessageBox.Show("خطا در هنگام کشیدن نمودار" + ex.Message, "خطا", MessageBoxButtons.OK, MessageBoxIcon.Error);
    this.Close();
    return;
    }
    }


    تست بفرمائید

  5. #5

    نقل قول: خطای گرفتن مقادیر x از نمودار در هنگام حرکت موس

    نقل قول نوشته شده توسط پرستو پارسایی مشاهده تاپیک
    private void DrawChart(){
    try
    {
    foreach (DataGridViewColumn column in dataGridView1.Columns)
    {
    column.SortMode = DataGridViewColumnSortMode.NotSortable;
    }


    double xmax = chart1.ChartAreas["ChartArea1"].AxisX.Maximum;


    foreach (DataGridViewRow row in dataGridView1.Rows)
    {
    if (row.Cells[1].Value != null)
    {
    string a = row.Cells[1].Value.ToString();
    DateTime date = DateTime.Parse(row.Cells[0].Value.ToString());
    double x = date.ToOADate(); // تبدیل تاریخ به عددی قابل استفاده در نمودار
    string yValue = row.Cells[2].Value.ToString();


    // افزودن داده‌ها به سری‌های مربوطه در نمودار
    if (a == "ورود نقدینگی")
    {
    chart1.Series["ورود نقدینگی"].Points.AddXY(x, yValue);
    }
    if (a == "خروج نقدینگی")
    {
    chart1.Series["خروج نقدینگی"].Points.AddXY(x, yValue);
    }
    }
    }


    // اعمال زوم بر روی محور افقی نمودار
    chart1.ChartAreas["ChartArea1"].AxisX.ScaleView.Zoom(0, xmax);
    }
    catch (Exception ex)
    {
    MessageBox.Show("خطا در هنگام کشیدن نمودار" + ex.Message, "خطا", MessageBoxButtons.OK, MessageBoxIcon.Error);
    this.Close();
    return;
    }
    }


    تست بفرمائید
    متاسفانه این روش تست شده و الان هم با کد شما تست کردم ولی شکل نمودار به هم میریزه. روش دیگه ای به نظرتون میرسه؟

  6. #6
    کاربر دائمی آواتار پرستو پارسایی
    تاریخ عضویت
    آبان 1392
    محل زندگی
    تهران
    پست
    458

    نقل قول: خطای گرفتن مقادیر x از نمودار در هنگام حرکت موس

    می‌توانم یک کد با استفاده از روش Data Binding برای رسم نمودار پیشنهاد دهم که با روش شما متفاوت هست :



    private void BindDataToChart()
    {
    // تعریف منبع داده
    DataTable dt = new DataTable();
    dt.Columns.Add("Date", typeof(DateTime));
    dt.Columns.Add("Type", typeof(string));
    dt.Columns.Add("Value", typeof(double));
    dt.Rows.Add(DateTime.Parse("2022-01-01"), "ورود نقدینگی", 5000);
    dt.Rows.Add(DateTime.Parse("2022-01-02"), "ورود نقدینگی", 2000);
    dt.Rows.Add(DateTime.Parse("2022-01-03"), "خروج نقدینگی", 1000);
    dt.Rows.Add(DateTime.Parse("2022-01-04"), "ورود نقدینگی", 3000);
    dt.Rows.Add(DateTime.Parse("2022-01-05"), "خروج نقدینگی", 500);
    dt.Rows.Add(DateTime.Parse("2022-01-06"), "خروج نقدینگی", 1000);


    // تنظیم منبع داده برای نمودار
    chart1.DataSource = dt;


    // تعریف ناحیه نمودار
    ChartArea chartArea1 = new ChartArea("ChartArea1");
    chart1.ChartAreas.Add(chartArea1);


    // تعریف سری‌ها برای هر نوع داده
    Series seriesIn = new Series("ورود نقدینگی");
    Series seriesOut = new Series("خروج نقدینگی");


    // تنظیم نقاط داده برای هر سری
    seriesIn.Points.DataBindXY(dt.Select("Type = 'ورود نقدینگی'"), "Date", "Value");
    seriesOut.Points.DataBindXY(dt.Select("Type = 'خروج نقدینگی'"), "Date", "Value");


    // افزودن سری‌ها به نمودار
    chart1.Series.Add(seriesIn);
    chart1.Series.Add(seriesOut);


    // فرمت بندی نمودار
    chartArea1.AxisX.LabelStyle.Format = "dd/MM/yyyy";
    chartArea1.AxisX.Interval = 1;
    chartArea1.AxisY.LabelStyle.Format = "{0:C0}";
    }


    در این کد، ابتدا یک DataTable به عنوان منبع داده تعریف شده و برای آن چندین سطر داده افزوده شده است. سپس منبع داده برای نمودار تنظیم شده و سه بخش اصلی نمودار (Chart Area و Series) تعریف شده است. در نهایت، داده‌های مربوط به هر نوع از داده‌ها (ورود و خروج نقدینگی) از جدول داده به صورت مستقیم به نمودار منتقل شده و سپس نمودار با استفاده از تنظیمات مختلف به صورت نهایی فرمت بندی می‌شود . تست بفرمائید اگر مشکلی بود مطرح کنید

  7. #7

    نقل قول: خطای گرفتن مقادیر x از نمودار در هنگام حرکت موس

    نقل قول نوشته شده توسط پرستو پارسایی مشاهده تاپیک
    می‌توانم یک کد با استفاده از روش Data Binding برای رسم نمودار پیشنهاد دهم که با روش شما متفاوت هست :



    private void BindDataToChart()
    {
    // تعریف منبع داده
    DataTable dt = new DataTable();
    dt.Columns.Add("Date", typeof(DateTime));
    dt.Columns.Add("Type", typeof(string));
    dt.Columns.Add("Value", typeof(double));
    dt.Rows.Add(DateTime.Parse("2022-01-01"), "ورود نقدینگی", 5000);
    dt.Rows.Add(DateTime.Parse("2022-01-02"), "ورود نقدینگی", 2000);
    dt.Rows.Add(DateTime.Parse("2022-01-03"), "خروج نقدینگی", 1000);
    dt.Rows.Add(DateTime.Parse("2022-01-04"), "ورود نقدینگی", 3000);
    dt.Rows.Add(DateTime.Parse("2022-01-05"), "خروج نقدینگی", 500);
    dt.Rows.Add(DateTime.Parse("2022-01-06"), "خروج نقدینگی", 1000);


    // تنظیم منبع داده برای نمودار
    chart1.DataSource = dt;


    // تعریف ناحیه نمودار
    ChartArea chartArea1 = new ChartArea("ChartArea1");
    chart1.ChartAreas.Add(chartArea1);


    // تعریف سری‌ها برای هر نوع داده
    Series seriesIn = new Series("ورود نقدینگی");
    Series seriesOut = new Series("خروج نقدینگی");


    // تنظیم نقاط داده برای هر سری
    seriesIn.Points.DataBindXY(dt.Select("Type = 'ورود نقدینگی'"), "Date", "Value");
    seriesOut.Points.DataBindXY(dt.Select("Type = 'خروج نقدینگی'"), "Date", "Value");


    // افزودن سری‌ها به نمودار
    chart1.Series.Add(seriesIn);
    chart1.Series.Add(seriesOut);


    // فرمت بندی نمودار
    chartArea1.AxisX.LabelStyle.Format = "dd/MM/yyyy";
    chartArea1.AxisX.Interval = 1;
    chartArea1.AxisY.LabelStyle.Format = "{0:C0}";
    }


    در این کد، ابتدا یک DataTable به عنوان منبع داده تعریف شده و برای آن چندین سطر داده افزوده شده است. سپس منبع داده برای نمودار تنظیم شده و سه بخش اصلی نمودار (Chart Area و Series) تعریف شده است. در نهایت، داده‌های مربوط به هر نوع از داده‌ها (ورود و خروج نقدینگی) از جدول داده به صورت مستقیم به نمودار منتقل شده و سپس نمودار با استفاده از تنظیمات مختلف به صورت نهایی فرمت بندی می‌شود . تست بفرمائید اگر مشکلی بود مطرح کنید
    متاسفانه این کد هم عمل نمیکنه قبلا مستقیما از خود دیتابیس هم اطلاعات رو لود کردم داخل نمودار ولی باز هم همون مشکل

تاپیک های مشابه

  1. پاسخ: 8
    آخرین پست: چهارشنبه 04 بهمن 1402, 15:06 عصر
  2. استخدام برنامه نویس PHP ، سیستمی و تحلیل گر ویروس و مهندس معکوس
    نوشته شده توسط hardworker110 در بخش آگهی های استخدام
    پاسخ: 0
    آخرین پست: یک شنبه 27 تیر 1395, 08:13 صبح
  3. پاسخ: 0
    آخرین پست: یک شنبه 16 خرداد 1395, 14:18 عصر
  4. انتخاب سطر زیر ماوس در datagridview با کلیک راست ماوس
    نوشته شده توسط hojjatshariffam در بخش C#‎‎
    پاسخ: 5
    آخرین پست: پنج شنبه 27 تیر 1392, 15:40 عصر
  5. سوال: سوال؟ یه مثال خوب و آسون برای موس و رنگ موس تو Turbo C++‎ 3.0 DOS
    نوشته شده توسط sadegh-hut در بخش برنامه نویسی با زبان C و ++C
    پاسخ: 21
    آخرین پست: جمعه 13 فروردین 1389, 02:01 صبح

برچسب های این تاپیک

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •