مرجع تخصصی برنامه نویسان

انجمن تخصصی برنامه نویسان فارسی زبان

کاربر سایت

sehar3244

عضویت از 1395/07/07

تغییر حالت پیش فرف کلیدEnterبرای DataGrid

  • چهارشنبه 28 مهر 1395
  • 12:00
تشکر میکنم

باسلام من تو برنامم میخوام با کلید اینتر کار کنم در دیتا گرید ویو مثلا با زدن اون به سلول بعد بره و مقدار سلول فعلی رو هم چک کنه و اگه شرط برقرار بود بیاد سلول های بعدی رو پر کنه و رو یه سلول خاص فوکوس انجام بدم  .

ولی چون در حالت پیش فرض فقط زمانی که سلول خالی با کلید اینتر رویداد keyDown وkey press فراخوانی میشه و موقعی که سلول پره به سطر بعد در همون ستون نشانگر قرار میگیره نمیتونم اینکارارو انجام بدم  .نمیدونم این مشکل رو چطور حل کنم سرچ کردم ولی چیزی پیدا نکرد .

ممنون میشم کمک کنید خیلی زمان گذاشتم  برای این مسعله .باتشکر

پاسخ های این پرسش

تعداد پاسخ ها : 12 پاسخ
کاربر سایت

ایمان مدائنی

عضویت از 1392/01/20

  • چهارشنبه 28 مهر 1395
  • 17:34


private void dataGridView1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {                
                e.SuppressKeyPress=true;
                int iColumn = dataGridView1.CurrentCell.ColumnIndex;
                int iRow = dataGridView1.CurrentCell.RowIndex;
                if (iColumn == dataGridView1.Columns.Count-1)
                    dataGridView1.CurrentCell = dataGridView1[0, iRow + 1];
                else
                    dataGridView1.CurrentCell = dataGridView1[iColumn + 1, iRow];

            }
        }

 

کاربر سایت

sehar3244

عضویت از 1395/07/07

  • جمعه 30 مهر 1395
  • 10:08

سلام خیلی ممنون بابت کد ولی من مشکلم اینکه وقتی که سلول پره رویداد keydown فراخوانی نمیشه و من میخوام وقتی پرهم هست به این رویداد بره .ممنون میشم کمک کنید.

با تشکر

کاربر سایت

ایمان مدائنی

عضویت از 1392/01/20

  • جمعه 30 مهر 1395
  • 18:02

باید فراخوانی بشه

 private void dataGridView1_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyData == Keys.Enter)
        {
            int col = dataGridView1.CurrentCell.ColumnIndex;
            int row = dataGridView1.CurrentCell.RowIndex;

            if (col < dataGridView1.ColumnCount - 1)
            {
                col ++;
            }
            else
            {
                col = 0;
                row++;
            }

            if (row == dataGridView1.RowCount)
                dataGridView1.Rows.Add();

            dataGridView1.CurrentCell = dataGridView1[col, row];
            e.Handled = true;
        }
    }

 

کاربر سایت

sehar3244

عضویت از 1395/07/07

  • شنبه 1 آبان 1395
  • 13:07

سلام عذر خواهم ولی شما اصن درست سوال من رو متوجه نشدین . من میخوام با زدن اینتر این رویداد لود شه که اصلا این اتفاق برای دیتا گرید نمیوفته وقتی سلول پره .کدی که شما قرار دادین برای رفتن به سلول بعد که این رو یه بار قرار دادین و الان نوع دیگه ی از  کد. که من اینو نمیخوام من مشکلم اینه که وقتی سلول پر هست اصلا با enter رویداد  keydown فراخوانی نمیشه و من نمیدونم این مشکل رو چطور حل کنم .

خواهش میکنم کمک کنید چون خیلی سرچ کردم ولی نشد .

با تشکر

کاربر سایت

سجاد باقرزاده

عضویت از 1392/02/24

  • شنبه 1 آبان 1395
  • 14:12

سلام، لطفا کد مورد نظرتون رو قرار بدید تا بررسی کنیم .

کاربر سایت

sehar3244

عضویت از 1395/07/07

  • یکشنبه 2 آبان 1395
  • 10:39

باسلام

  private void dataGridViewFactor_KeyDown(object sender, KeyEventArgs e)
        {

            if (e.KeyData == Keys.Enter)
            {
                        e.SuppressKeyPress = true;
                        int iColumn = dataGridViewFactor.CurrentCell.ColumnIndex;
                        int iRow = dataGridViewFactor.CurrentCell.RowIndex;
                if (iColumn == 0 && dataGridViewFactor[iColumn, iRow].Value.ToString() != "")
                {
                    string s = dataGridViewFactor[0, iRow].Value.ToString();
                    var all = from a in context.mojodi_anbars
                              join b in context.kalas on a.id equals b.id
                              where b.id == s
                              select new
                              {
                                  b.name,
                                  b.mony,

                              };
                    
                    foreach (var item in all)
                    {
                        dataGridViewFactor.Rows[iRow].Cells[1].Value = item.name;
                        dataGridViewFactor.Rows[iRow].Cells[2].Value = item.mony;
                        if (iColumn == dataGridViewFactor.Columns.Count - 1)
                            dataGridViewFactor.CurrentCell = dataGridViewFactor[0, iRow + 1];
                        else
                            dataGridViewFactor.CurrentCell = dataGridViewFactor[3, iRow];

                    }


                    if (iColumn == 4 && dataGridViewFactor[2, iRow].Value.ToString() != "" && dataGridViewFactor[3, iRow].Value.ToString() != "")
                    {
                        int q = Convert.ToInt32(dataGridViewFactor[2, iRow].Value);
                        int c = Convert.ToInt32(dataGridViewFactor[3, iRow].Value);
                        dataGridViewFactor[iRow, iRow].Value = Convert.ToString(q * c);
                        jameqeimat += Convert.ToInt32(dataGridViewFactor[iColumn, iRow].Value);
                        dataGridViewFactor[iColumn, iRow + 1].Value = jameqeimat;
                        dataGridViewFactor[iColumn + 1, iRow + 1].Value = "جمع کل";
                    }
           
                    if (all.Count() == 0)
                    {
                        my_message.Messege.Text = "کالای با این کد وجود ندارد.";
                        my_message.No.Visible = false;
                        my_message.Yes.Visible = false;
                        my_message.Ok.Visible = true;
                        my_message.ShowDialog();

                    }

                }
                if (iColumn == 0 && dataGridViewFactor[iColumn, iRow].Value.ToString() == "")
                {
                    if (dataGridViewFactor[ColumGrid, RowsGrid].Value.ToString() == "")
                    {
                        listkala li = new listkala();
                        li.ShowDialog();

                    }

                }
               
            }
        }

 

این کدی هست که میخوام اجرا بشه ولی وقتی سلول پرمیشه این رویداد فراخوانی نمیشه که کد برنامم اجرا بشه .

ممنون میشم کمک کنید بیشتر از یه هفتست که درگیر این موضوعم روش های مختلفی امتحان کردم ولی متاسفانه به نتیجه نرسیدم .

حتی خواستم کلید اینتر رو برای خود صفحه ی که درون دیتاگریدم هست در رویداد صفحه تبدیل به کلید دیگه ی کنم که اون هم جواب نداد .

کاربر سایت

سجاد باقرزاده

عضویت از 1392/02/24

  • یکشنبه 2 آبان 1395
  • 12:29

دوست عزیز، شما بجای استفاده از رویداد KeyDown از CellLeave استفاده کنید.

KeyDown هر کلیدی که روی گرید زده شود اون رویداد صدا زده می شود ولی در حالت leave شما با enter یا tab فقط یکبار رویداد رو صدا می زنید.

کاربر سایت

sehar3244

عضویت از 1395/07/07

  • یکشنبه 2 آبان 1395
  • 13:51

خیلی ممنون از راهنمایتون ولی این کار رو هم انجام دادم چون میخوام همون سلول رو مقدارش رو چک کنم خطای nullrefrenc میده و نمیتونم این کار رو بکنم .

اگه ممکنه یه راه دیگه پیشنهاد بدین.

عکس خطا رو قرار دادم .

ممنون

فایل های ضمیمه

کاربر سایت

سجاد باقرزاده

عضویت از 1392/02/24

  • یکشنبه 2 آبان 1395
  • 13:57

کل پروژه یا اون بخش از پروژه تون رو به همراه دیتابیس به صورت zip شده اینجا قرار بدید تا من خط به خط چک کنم.

کاربر سایت

سجاد باقرزاده

عضویت از 1392/02/24

  • یکشنبه 2 آبان 1395
  • 16:38

من فایل ضمیه را برداشتم ، میتونید الان حذفش کنید .

کاربر سایت

sehar3244

عضویت از 1395/07/07

  • چهارشنبه 5 آبان 1395
  • 11:34

سلام

وقت کردید برنامم رو ببینید؟؟

کاربر سایت

sehar3244

عضویت از 1395/07/07

  • دوشنبه 10 آبان 1395
  • 11:20

سلام

روشی برای حل این مشکل من هست؟؟

ممنون میشم یه جوابی به من بدین .

با تشکر

کاربرانی که از این پست تشکر کرده اند

هیچ کاربری تا کنون از این پست تشکر نکرده است

اگر نیاز به یک مشاور در زمینه طراحی سایت ، برنامه نویسی و بازاریابی الکترونیکی دارید

با ما تماس بگیرید تا در این مسیر همراهتان باشیم :)