PDA

View Full Version : حرفه ای: جدا کردن اعداد داخل گرید



araz_pashazadeh
دوشنبه 25 مهر 1390, 13:51 عصر
با سلام خدمت دوستان
من سرویسی طراحی کردم برای جدا کردن اطلاعات داخل گرید به صورت 3رقم 3رقم که کد آن بصورت زیر می باشد: using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;

namespace TextBoxColumnFilter
{
public class TextBoxColumn : DataGridViewColumn
{
public TextBoxColumn() : base(new TextBoxCell())
{

}
public override DataGridViewCell CellTemplate
{
get
{
return base.CellTemplate;
}
set
{
if (value != null && !value.GetType().IsAssignableFrom(typeof(TextBoxCe ll)))
{
throw new InvalidCastException("Error");
}
base.CellTemplate = value;
}
}
}

public class TextBoxCell : DataGridViewTextBoxCell
{
public TextBoxCell() : base()
{

}

public override Type EditType
{
get
{
return typeof(EditTextBoxCell);
}
}

public override void InitializeEditingControl(int rowIndex, object initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle)
{
base.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle);
EditTextBoxCell editingControl = base.DataGridView.EditingControl as EditTextBoxCell;
if (editingControl != null)
{
editingControl.BorderStyle = BorderStyle.None;
editingControl.AcceptsReturn = editingControl.Multiline = dataGridViewCellStyle.WrapMode == DataGridViewTriState.True;
editingControl.MaxLength = this.MaxInputLength;
string str = initialFormattedValue as string;
if (str == null)
{
editingControl.MyText = string.Empty;
}
else
{
editingControl.MyText = str;
}
}
}
}

public class EditTextBoxCell : TextBox, IDataGridViewEditingControl
{
DataGridView dataGridView;
private bool valueChanged = false;
int rowIndex;

public EditTextBoxCell()
: base()
{
}

// اگر میخواهید عداد سه تا سه تا جدا شود
bool discreteNumeric = true;

// اگر میخواهید تنها هنگام تایپ کردن سه تا سه تا جدا شود
bool discreteNumOnlyView = false;

public string MyText
{
get
{
if (discreteNumeric)
return base.Text.Replace(",", "");
else
return base.Text;
}
set
{
base.Text = value;
}
}
protected override void OnTextChanged(EventArgs e)
{
if (discreteNumeric)
{
string strText = this.MyText;
for (int i = strText.Length - 3; i > 0; i = i - 3)
{
strText = strText.Insert(i, ",");
}
this.SelectionStart = strText.Length + 1;
this.MyText = strText;
}
base.OnTextChanged(e);
this.NotifyDataGridViewOfValueChange();
}

public bool DiscreteNumeric
{
get
{
return discreteNumeric;
}
set
{
discreteNumeric = value;
}
}
protected override void OnKeyPress(KeyPressEventArgs e)
{
if (!((int)e.KeyChar >= 48 && (int)e.KeyChar <= 57) && e.KeyChar != 8)
e.KeyChar = char.MinValue;
}


#region IDataGridViewEditingControl Members

public void ApplyCellStyleToEditingControl(DataGridViewCellSty le dataGridViewCellStyle)
{
// استفاده نشد

}

public DataGridView EditingControlDataGridView
{
get
{
return dataGridView;
}
set
{
dataGridView = value;
}
}

public object EditingControlFormattedValue
{
get
{
if (discreteNumOnlyView)
return this.MyText;
else
return this.Text;
}
set
{
this.MyText = (string)value;
}
}

public int EditingControlRowIndex
{
get
{
return rowIndex;
}
set
{
rowIndex = value;
}
}

public bool EditingControlValueChanged
{
get
{
return valueChanged;
}
set
{
valueChanged = value;
}
}

public bool EditingControlWantsInputKey(Keys keyData, bool dataGridViewWantsInputKey)
{
switch (keyData & Keys.KeyCode)
{
case Keys.Left:
case Keys.Up:
case Keys.Down:
case Keys.Right:
case Keys.Home:
case Keys.End:
case Keys.PageDown:
case Keys.PageUp:
case Keys.Enter:
return true;
default:
return false;
}
}

public Cursor EditingPanelCursor
{
get { return base.Cursor; }
}

public object GetEditingControlFormattedValue(DataGridViewDataEr rorContexts context)
{
return EditingControlFormattedValue;
}

//protected override void OnTextChanged(EventArgs e)
//{
// base.OnTextChanged(e);
// this.NotifyDataGridViewOfValueChange();
//}

private void NotifyDataGridViewOfValueChange()
{
this.valueChanged = true;
this.dataGridView.NotifyCurrentCellDirty(true);
}

public void PrepareEditingControlForEdit(bool selectAll)
{
if (selectAll)
{
base.SelectAll();
}
else
{
base.SelectionStart = this.Text.Length;
}
}

public bool RepositionEditingControlOnValueChange
{
get { return false; }
}
#endregion
}
}

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

faravaghi
سه شنبه 26 مهر 1390, 14:36 عصر
سلام عزیز،
یه کاری بکن ببین میشه:
هر تابعی برای Load شدن فرم نوشتی همون رو به رویداد Enter نیز نسبت بده. ببین درست میشه.
من خودم وقتی میخوام برای DataGridView ردیف تعریف کنم و دستی توش عدد بزارم با Load نمیشه ولی وقتی 2 بار تابع فراخوانی میشه این کار انجام میگیره. حالا نفهمیدم چرا ولی جواب داده!

araz_pashazadeh
سه شنبه 26 مهر 1390, 19:05 عصر
دوست عزیز DataGridView رخدادی به نام Loadنداره به همین دلیل منم برای اینک بتونم سه رقم سه رقم جدا کنم از کلاس TextBox استفاده کردم تا بتونم رخداد OnTextChanged را به ستونهای DataGridViewاضافه کنم در قسمت ویرایش که هنگام کلیک روی سلول فعال میشه تونستم این کار را انجام بدم ولی هر کاری کردم نتونستم این رخداد را در هنگام لود یا کاری کنم که اولین بار فعال بشه در بالا کد کامل را گذاشتم مشخص هستش اگه بیشتر راهنمایی کنین ممنون میشم چون نمی دونم چیکار کنم؟

faravaghi
چهارشنبه 27 مهر 1390, 11:02 صبح
سلام عزیز،
یه کاری بکن ببین میشه:
هر تابعی برای Load شدن فرم نوشتی
سلام گرامی،
من کی گفتم DataGridView رویداد Load داره! گفتم هر کار برای Load شدن فرم کردی برای رویداد Enter هم بکن!!!!!

araz_pashazadeh
چهارشنبه 27 مهر 1390, 13:44 عصر
دوست عزیز شما اصلا به کدی که من قرار دادم نگاه نکردین!!
من در کد بالا می خوام خصوصیات ستونهای دیتا گرید را طوری عوض کنم که در زمان ساخته شدن این خصوصیت را در خودشون داسته باشن تا حدودی هم موفق شدم ولی مشکل اینجاست که فقط در زمان لود دیتا گرید کار نمی کنه.
با انتخاب سلول و یا ویرایش اون فعال میشه.

az.heidarzadeh
چهارشنبه 27 مهر 1390, 14:02 عصر
سلام
نمیدونم چه کاری بوده که کد به این طولانی رو نوشتی، اگه میخوای توی گریدت اعدادت از هم سه تا سه تا جدا بشه کافی بود Cell مورد نظرت رو بهش فرمت بدی اینطوری مثلا اگه توی ستونت قراره مقدار پولی باشه 30000 رو به صورت 30،000 ریال نمایش میده یا هر فرمتی که میخوای... اصلا کد نمیخواد

araz_pashazadeh
سه شنبه 22 آذر 1390, 18:07 عصر
سلام
نمیدونم چه کاری بوده که کد به این طولانی رو نوشتی، اگه میخوای توی گریدت اعدادت از هم سه تا سه تا جدا بشه کافی بود Cell مورد نظرت رو بهش فرمت بدی اینطوری مثلا اگه توی ستونت قراره مقدار پولی باشه 30000 رو به صورت 30،000 ریال نمایش میده یا هر فرمتی که میخوای... اصلا کد نمیخواد

منون از راهنمایی شما من دقیقا از همین روش استفاده کردم ولی من می خوام وقتی کاربر در دیتاگرید اطلاعات را وارد کرد در حین وارد کردن اطلاعات اطلاعات همزمان 3رقم 3رقم جدا بشه من برای این کار کد زیر را نوشتم مشکلی هم ندلره ولی وقتی می خوام اطلاعات را داخل سلول قرار بدم خطا می ده چون فیلد موجود در پایگاه از نوع دسیمال هستش و اطلاعاتی که من قرار می دم از نوع رشته هستش.
جالب اینجاست که گرید همین کار را انجام میده ولی نمی دونم چطور.
private void txtCash_KeyUp(object sender, KeyEventArgs e)
{
NumberFormatInfo nfi = new NumberFormatInfo();
nfi.NumberDecimalDigits = 0;
string ss = Decimal.Parse(dataGridViewBankAccount.CurrentRow.C ells["Cash"].EditedFormattedValue.ToString().Remove(0, 5),
NumberStyles.AllowThousands).ToString("N", nfi);
//dataGridViewBankAccount.CurrentRow.Cells["Cash"].ValueType = typeof(string);
dataGridViewBankAccount.CurrentRow.Cells["Cash"].Value = ss;
}
/************************************************** ************************************************** **********************************/
private void dataGridViewBankAccount_EditingControlShowing(obje ct sender, DataGridViewEditingControlShowingEventArgs e)
{
TextBox text = e.Control as TextBox;
if (dataGridViewBankAccount.CurrentCell.ColumnIndex == 3)
{
if (text != null)
text.KeyUp += new KeyEventHandler(txtCash_KeyUp);
}
//رنگی کردن سلول در هنگام ویرایش
e.CellStyle.BackColor = Color.Pink;
}
منون میشم اگه دوستان من را در این زمینه راهنمایی کنن.