PDA

View Full Version : مبتدی: وارد کردن سه صفر در سلول datagridview



svhasvha
شنبه 18 خرداد 1398, 07:28 صبح
سلام خدمت دوستان عزیز
یه دیتا گرید دارم یه سلول داره که عدد میگیره حالا کاربر ازم خواسته یه کلید رو (مثلا کلید+) رو به عنوان کلید سه صفر تعریف کنم مثل کلید ماشین حساب که با زدن این کلید سه صفر به انتهای عددی که وارد کرده اضافه بشه
خودم این به ذهنم رسید که جواب نداد

private void DGSanad_KeyUp(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Add)
{
if (DGSanad.CurrentCell.ColumnIndex == DGSanad.Columns["BED"].Index || DGSanad.CurrentCell.ColumnIndex == DGSanad.Columns["BES"].Index)
{
DGSanad.CurrentCell.Value = (Convert.ToInt64(DGSanad.CurrentCell.EditedFormatt edValue.ToString()) * 1000).ToString();

}
}
}

ممنون میشم کمک کنید لطف میکنید

محمد رضا فاتحی
یک شنبه 19 خرداد 1398, 09:49 صبح
سلام
یکبار بدون شرط انجام بدین یا تریس کنید ببنید داخل شرط وارد میشه یا نه
به جای EditedFormattedValue هم از value استفاده کنید

svhasvha
یک شنبه 19 خرداد 1398, 10:53 صبح
سلام
یکبار بدون شرط انجام بدین یا تریس کنید ببنید داخل شرط وارد میشه یا نه
به جای EditedFormattedValue هم از value استفاده کنید

سلام مشکل شرط نیست
از value هم که استفاده میکنم مقدار null
ببینید مشکل اینجاست که وقتی سلول در حال ادیت شدنه یعنی شما داری مقدار بهش میدی هنوز سلول value نگرفته که پس مقدار null میده
من وارد سلول شد و دارم دیتا اینتری میکنم مثلا 22 رو زدم حالا میخوام به جای اینکه سه بار صفر رو بزنم کلید + رو بزنم خودش سه صفر به آخر عبارت اضافه کنه
به مقدار با Value نمیشه دسترسی پیدا کرد

svhasvha
دوشنبه 20 خرداد 1398, 10:38 صبح
دوستان عزیز کسی نیست راهنمایی کنه
فکر نکنم اینقد پیچیده باشه
دیدین یه کار ساده به خنسی میخوره
تو هزار تا برنامه دیدم این مورد رو
یه لطفی کنید
میدونم همه سرشون شلوغه و درگیر و این مشکل منم پیش پا افتاده ولی بد کارمو لنگ کرده

svhasvha
دوشنبه 20 خرداد 1398, 10:57 صبح
دوستان گلم چنتا عکس با توضیح میزارم شاید بتونید کمک کنید
150331
اینجا کار بر عدد دو رو تو فیلد بده کار وارد میکنه
پایین فرم سیستم جمع value ستون بده کار رو نشوون میده که همون 2 هست
150327
اینجا کاربر کلید add (+) رو میزنه مقدار فیلد دیتا گرید تغییری نمیکنه ولی تو پایین فرم جمع مقدار ستون رو که بر اساس value سلول هست درست نشون میده
150328
حالا کاربر از ستون خارج میشه مقدار سلول همون 2 مقدار جمع ستون بده کارم میشه 2 یعنی value تغییر میکنه
150329
حالا اینجا کار بر مجدد بر میگرده به سلول بدهکار سلول سلکت میشه(رو ادیت نمیره)
150330
حالا کاربر (+) رو میزنه باز مثل مرحله قبل مقدار سلول تغییر پیدا نمیکنه ولی جمع مقدار ستون تو پایین فرم درست میشه
اما این بار که کاربر از ستون خارج میشه مقدار سلول تغییر پیدا میکنه و هم مقدار سلول درسته هم مقدار جمع ستون اون پایین
(امکان لود عکس پنجم نبود تو پست بعدی میزارم)

svhasvha
دوشنبه 20 خرداد 1398, 11:14 صبح
150332
نتیجه کلی اینکه کد بالا که تو پست اول گذاشتم خروجیش میشه اینکه
وقتی کاربر در حالت دیتا انتری هست ت سلول و کلید + رو میزنه مقدار نمایش داده شده تو اون لحظه تو سلول تغییر نمیکنه اما مقدار value سلول تغییر میکنه اما بعد از خروج از سلول دوباره مقدار value برابر میشه با EditedFormattedValue
یعنی غلط در غلط
اما وقتی کاربر رو حالت سلکت تو سلول هست و + رو میزنه باز مقدار value تغییر میکنه اما EditedFormattedValue نه ولی وقتی از سلول خارج میشه اینبار مقدار EditedFormattedValue که برابر با value میشه!
حال شما پرتغال فروشو پیدا کنید

نکته هم اینکه اگه دوستانی که پیشنهاد میکنن کدر به حالت زیر تغییر بدم
private void DGSanad_KeyUp(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Add)
{
if (DGSanad.CurrentCell.ColumnIndex == DGSanad.Columns["BED"].Index || DGSanad.CurrentCell.ColumnIndex == DGSanad.Columns["BES"].Index)
{
DGSanad.CurrentCell.EditedFormattedValue = (Convert.ToInt64(DGSanad.CurrentCell.EditedFormatt edValue.ToString()) * 1000).ToString();
}
}
}
بگم که EditedFormattedValue فقط خواندنی و نمیشه اینجوری بهش مقدار داد

mr.sirwan
دوشنبه 20 خرداد 1398, 12:56 عصر
الان یکم با ایونت ها کار کردم تونستم به این چیزی که شما مدنظرته برسم، یه تست کن ببین درسته؟
اول اینکه کد keyup که خودت نوشتی رو کلا بردار و حذف کن، بعدش برای دیتاگریدت باید ایونت EditingControlShowing رو پیاده کنی به اینصورت:
private void DataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
var txtBox = e.Control as TextBox;
if (txtBox != null)
{
// حذف هندلرهایی که قبلا دنبال شده اند برای اجتناب از دنبال کردن هندلرهای اضافی
txtBox.KeyDown -= new KeyEventHandler(DgvTextBox_KeyDown);
txtBox.TextChanged -= new EventHandler(DgvTextBox_TextChanged);

// دنبال کردن ایونت هندلر ها
txtBox.KeyDown += new KeyEventHandler(DgvTextBox_KeyDown);
txtBox.TextChanged += new EventHandler(DgvTextBox_TextChanged);
}
}

حالا باید ایونت های DgvTextBox_KeyDown و DgvTextBox_TextChanged رو به این شکل تعریف کنی:


void DgvTextBox_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Add)
{
if (dataGridView1.CurrentCell.ColumnIndex == dataGridView1.Columns["BED"].Index || dataGridView1.CurrentCell.ColumnIndex == dataGridView1.Columns["BES"].Index)
{
dataGridView1.CurrentCell.Value = (Convert.ToInt64(dataGridView1.CurrentCell.EditedF ormattedValue.ToString()) * 1000).ToString();
}
}
}

void DgvTextBox_TextChanged(object sender, EventArgs e)
{
if (dataGridView1.CurrentCell.Value != null)
{
var txtBox = (TextBox)sender;
if (txtBox.Focused)
{
if (dataGridView1.CurrentCell.EditedFormattedValue.To String().Contains('+'))
txtBox.Text = dataGridView1.CurrentCell.Value.ToString();
else
txtBox.Text = dataGridView1.CurrentCell.EditedFormattedValue.ToS tring();

txtBox.SelectionStart = txtBox.Text.Length;
}
}
}

svhasvha
دوشنبه 20 خرداد 1398, 14:57 عصر
الان یکم با ایونت ها کار کردم تونستم به این چیزی که شما مدنظرته برسم، یه تست کن ببین درسته؟
اول اینکه کد keyup که خودت نوشتی رو کلا بردار و حذف کن، بعدش برای دیتاگریدت باید ایونت EditingControlShowing رو پیاده کنی به اینصورت:
private void DataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
var txtBox = e.Control as TextBox;
if (txtBox != null)
{
// حذف هندلرهایی که قبلا دنبال شده اند برای اجتناب از دنبال کردن هندلرهای اضافی
txtBox.KeyDown -= new KeyEventHandler(DgvTextBox_KeyDown);
txtBox.TextChanged -= new EventHandler(DgvTextBox_TextChanged);

// دنبال کردن ایونت هندلر ها
txtBox.KeyDown += new KeyEventHandler(DgvTextBox_KeyDown);
txtBox.TextChanged += new EventHandler(DgvTextBox_TextChanged);
}
}

حالا باید ایونت های DgvTextBox_KeyDown و DgvTextBox_TextChanged رو به این شکل تعریف کنی:


void DgvTextBox_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Add)
{
if (dataGridView1.CurrentCell.ColumnIndex == dataGridView1.Columns["BED"].Index || dataGridView1.CurrentCell.ColumnIndex == dataGridView1.Columns["BES"].Index)
{
dataGridView1.CurrentCell.Value = (Convert.ToInt64(dataGridView1.CurrentCell.EditedF ormattedValue.ToString()) * 1000).ToString();
}
}
}

void DgvTextBox_TextChanged(object sender, EventArgs e)
{
if (dataGridView1.CurrentCell.Value != null)
{
var txtBox = (TextBox)sender;
if (txtBox.Focused)
{
if (dataGridView1.CurrentCell.EditedFormattedValue.To String().Contains('+'))
txtBox.Text = dataGridView1.CurrentCell.Value.ToString();
else
txtBox.Text = dataGridView1.CurrentCell.EditedFormattedValue.ToS tring();

txtBox.SelectionStart = txtBox.Text.Length;
}
}
}



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

چون تو کدای که فرستادی دو خطش ذهنمو مث یه نور افکن روشن کرد کدوم کد؟؟؟
یکی این
// حذف هندلرهایی که قبلا دنبال شده اند برای اجتناب از دنبال کردن هندلرهای اضافی
txtBox.KeyDown -= new KeyEventHandler(DgvTextBox_KeyDown);
txtBox.TextChanged -= new EventHandler(DgvTextBox_TextChanged);

و یکی

txtBox.SelectionStart = txtBox.Text.Length;


اومدم چیکار کردم

اول
private void DGSanad_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
// سلول ها فقط عدد بگیرند
text = e.Control as TextBox;
if (DGSanad.CurrentCell.ColumnIndex == DGSanad.Columns["BED"].Index || DGSanad.CurrentCell.ColumnIndex == DGSanad.Columns["BES"].Index)
{
text.KeyPress -= new KeyPressEventHandler(DGSanad_KeyPress);

text.KeyPress += new KeyPressEventHandler(DGSanad_KeyPress);
}



} اون قسمت اول کدت اینجا به درد خورد که باعث میشد متدDGSanad_KeyPress بیخودی چند بار فراخوانی نشه
بعد نوبت کد

private void DGSanad_KeyPress(object sender, KeyPressEventArgs e)
{
if (DGSanad.CurrentCell.ColumnIndex == DGSanad.Columns["BED"].Index || DGSanad.CurrentCell.ColumnIndex == DGSanad.Columns["BES"].Index )
{
//-----------------------------اگر غیر از عدد وارد شد--------------
if (!char.IsDigit(e.KeyChar))
{
if (e.KeyChar != 8 && e.KeyChar != 46)
e.Handled = true;
else
{
if (e.KeyChar != 8)
e.Handled = true;
}
//---------------------------اضافه کردن سه صفر با +---------------------------
if (e.KeyChar == 43)
{
if (DGSanad.CurrentCell.ColumnIndex == DGSanad.Columns["BED"].Index || DGSanad.CurrentCell.ColumnIndex == DGSanad.Columns["BES"].Index)
{
DGSanad.CurrentCell = DGSanad.CurrentRow.Cells[DGSanad.CurrentCell.ColumnIndex - 1];
DGSanad.CurrentRow.Cells[DGSanad.CurrentCell.ColumnIndex + 1].Value = (Convert.ToInt64(DGSanad.CurrentRow.Cells[DGSanad.CurrentCell.ColumnIndex + 1].Value) * 1000).ToString();
DGSanad.CurrentCell = DGSanad.CurrentRow.Cells[DGSanad.CurrentCell.ColumnIndex + 1];
}
}
}
}

}
که قسمت اولش مربوط به وارد نشدن کاراکتر غیر عددی که ربطی به این داستان نداره
بعد در آخر چون برای رفع مشکل value که تو پست های بالا توضیح دادم تو این متد یه بار از سلول خارج ووارد میشم برای اینکه همیشه مکان نما آخر تکس قرار بگیره از کدی که تو پست شما بود استفاده کردم
یعنی

private void dataGridView1_CellEnter(object sender, DataGridViewCellEventArgs e)
{
if (DGSanad.CurrentCell.ColumnIndex == DGSanad.Columns["BED"].Index || DGSanad.CurrentCell.ColumnIndex == DGSanad.Columns["BES"].Index)
{
if (DGSanad.CurrentCell.EditType == typeof(DataGridViewTextBoxEditingControl) && DGSanad.CurrentCell.Value!=null)
{
if (DGSanad.CurrentCell.Value.ToString() != "0")
{
DGSanad.BeginEdit(false);
((TextBox)DGSanad.EditingControl).SelectionStart = DGSanad.CurrentCell.Value.ToString().Length + (DGSanad.CurrentCell.Value.ToString().Length/3);
}
}
}
}

}


حالا چرا اون تیکه آخر گفتم مکان نمار رو به اندازه طول رشته + طول رشته تقسیم بر 3 ببر ؟ چون من فرمت سلول رو تنظیم کرده بودم سه کاراکتر سه کاراکتر جدا کنه واسه همین طول رشته و به علاوه تعداد کاراکتر های جدا کننده بکن که اگه این کارو نکنم مکان نما به آخر متن نمیره و به تعداد جدا کننده ها عقب میفتاد
اقا یه دنیا ممنون کارم راه افتداد البته با لطف شما ایشالا به درد دوستان دیگه مونم بخوره
آقا مث کلاس اولا توضیح دادم ببخشید گفتم شاید یه درصد از افرادی که میان سوادشون در حد خودم باشه
یا علی

mr.sirwan
دوشنبه 20 خرداد 1398, 15:19 عصر
کدی که من نوشتم بصورت داینامیک و آنی تغییراتی که توسط کاربر ایجاد میشه رو توی سلول اعمال میکنه و اینجوری نیست که حتما نیاز باشه که فوکوس از سلول خارج بشه تا تغییرات به یکباره اعمال بشه، همچنین مشکل value هم نداره و مقدار editedformatted و value با هر تغییر دقیقا باهم برابر میشن

پروژه تست خودم رو آپلود میکنم یه بررسی و تست کنین، اما در هر حال خوشحالم که مشکلتون برطرف شد

svhasvha
دوشنبه 20 خرداد 1398, 15:58 عصر
کدی که من نوشتم بصورت داینامیک و آنی تغییراتی که توسط کاربر ایجاد میشه رو توی سلول اعمال میکنه و اینجوری نیست که حتما نیاز باشه که فوکوس از سلول خارج بشه تا تغییرات به یکباره اعمال بشه، همچنین مشکل value هم نداره و مقدار editedformatted و value با هر تغییر دقیقا باهم برابر میشن

پروژه تست خودم رو آپلود میکنم یه بررسی و تست کنین، اما در هر حال خوشحالم که مشکلتون برطرف شد

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