نوشته شده توسط
mr.sirwan
الان یکم با ایونت ها کار کردم تونستم به این چیزی که شما مدنظرته برسم، یه تست کن ببین درسته؟
اول اینکه کد 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 ببر ؟ چون من فرمت سلول رو تنظیم کرده بودم سه کاراکتر سه کاراکتر جدا کنه واسه همین طول رشته و به علاوه تعداد کاراکتر های جدا کننده بکن که اگه این کارو نکنم مکان نما به آخر متن نمیره و به تعداد جدا کننده ها عقب میفتاد
اقا یه دنیا ممنون کارم راه افتداد البته با لطف شما ایشالا به درد دوستان دیگه مونم بخوره
آقا مث کلاس اولا توضیح دادم ببخشید گفتم شاید یه درصد از افرادی که میان سوادشون در حد خودم باشه
یا علی