PDA

View Full Version : سوال: فوري: سه رقم سه رقم جدا كردن عدد در حين وارد كردن داده در سلول گريدويو



tara1367
سه شنبه 07 آذر 1391, 10:42 صبح
سلام دوستان
من ميخوام وقتي دارم داده در سلول گريد ويو وارد ميكنم همزمان سه رقم سه رقم اعداد با كاما جدا شوند روش هاي زيادي را امتحان كردم و خيلي در اينترنت سرچ كردم ولي متأسفانه به نتيچه نرسيدم يعني مشكل اينجاست كه ميخوام اين عمل در حين وارد كردن داده انجام شود. اين كه DefaultCellstyle سلول را به فرمت N0 تغيير دهيم را امتحان كردم ولي براي وقتي است كه داده ها از قبل وارد شده باشند و يا حتي كد هاي زير را امتحان كردم ولي هيچ كدوم جواب ندادند خواهشمندم هر كسي ميدونه راهنمايي كنه ممنون ميشم.


private void DGVKarkard_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
if (DGVKarkard.CurrentCell.ColumnIndex == DGVKarkard.Columns[13].Index)
{
e.Control.TextChanged += new EventHandler(textBoxX1_TextChanged);
cntObject = e.Control;
cntObject.TextChanged += textBoxX1_TextChanged;
}
}

private void textBoxX1_TextChanged(object sender, EventArgs e)
{
try
{
if (cntObject.Text != string.Empty)
{
textBoxX1.Text = cntObject.Text;
}
}
catch
{ }
}

و بعد در رويداد keyup تكست باكس از تكه كدي كه سه رقم سه رقم جدا ميكند و در كلاس Codes ميباشد استفاده كردم:
private void textBoxX1_KeyUp(object sender, KeyEventArgs e)
{
try
{
codes.AllowThousandSeperator(textBoxX1);
}
catch
{ }
}


public void AllowThousandSeperator(TextBox tx)
{
if (tx.Text != "")
{
NumberFormatInfo nfi = new NumberFormatInfo();
nfi.NumberDecimalDigits = 0;
tx.Text = Int64.Parse(tx.Text, NumberStyles.AllowThousands).ToString("N", nfi);
tx.Select(tx.Text.Length, 0);
}
}





و يا حتي اين روش رو هم امتحان كردم ولي بازم جواب نداد:

TextBox text = e.Control as TextBox;
if (DGVKarkard.CurrentCell.ColumnIndex == DGVKarkard.Columns[13].Index)
{
if (text != null)
text.TextChanged += new EventHandler(textBoxX1_TextChanged);
}


private void textBoxX1_TextChanged(object sender, EventArgs e)
{
try
{
TextBox tx = new TextBox();
tx.Text = DGVKarkard.Rows[DGVKarkard.CurrentRow.Index].Cells[13].Value.ToString();
if (tx != null)
codes.AllowThousandSeperator(tx);
}
catch
{ }
}



خواهشمندم هر كسي ميدونه مشكل از كجاست كمك كنه با تشكر

vistacali
سه شنبه 07 آذر 1391, 10:51 صبح
من بودم این کار رو میکردم ::: اولین راهی که به نظرم اومد اینه اما شاید راههای دیگه هم باشه ، وقتی داری عددی رو میخونی مثلا 123456789 خوب بیا یک تابع یا یک کلاس بنویس و کل عدد رو تبدیل کن به کد اسکی و بعد از هر سه کد اسکی یه کاما بزار و بعد اونو در سلول مورد نظر ذخیره کن :چشمک:

tara1367
سه شنبه 07 آذر 1391, 11:13 صبح
مشكرم از راهنماييتون ولي من روش سه رقم سه رقم جدا كردن يك عدد معمولي كه مثلا در textbox وارد ميشود را بلدم مشكلم در datagridvie هست اونم در حين وارد كردن داده در سلول.

vistacali
سه شنبه 07 آذر 1391, 11:33 صبح
مشكرم از راهنماييتون ولي من روش سه رقم سه رقم جدا كردن يك عدد معمولي كه مثلا در textbox وارد ميشود را بلدم مشكلم در datagridvie هست اونم در حين وارد كردن داده در سلول.


وارد کردن در سلول کجاش رو مشکل داری من منظورتون رو نمیفهممم درست میشه بیشتر توضیح بدید

tara1367
سه شنبه 07 آذر 1391, 12:34 عصر
وارد کردن در سلول کجاش رو مشکل داری من منظورتون رو نمیفهممم درست میشه بیشتر توضیح بدید

ببينيد من ميخوام در حين وارد كردن عدد در سلول گريدويو اين اتفاق بيفته مثل زماني كه شما دارين يه عدد رو در يه textbox مينويسين ولي الان دارين در ديتاگريدويو مي نويسين.

es.es.es
سه شنبه 07 آذر 1391, 12:59 عصر
خوب یه آرایه درست کن وقتی که داری اعداد رو وارد میکنی وارد اون آرایه بشه و سلول گرید ویو اون آرایرو نشون بده وعد به اون آرایه هم بگو بعد از مضربای 3 یه کاما بذاره

tara1367
سه شنبه 07 آذر 1391, 14:02 عصر
ممنون ولي دنبال يه راه حل بهتر هستم فكر نمي كنم با اين راه حل شما هم جواب بده چون من كد جدا كردن سه رقم سه رقم رو دارم مشكلم اينه كه اين كد براي در حين وارد كردن داده كار نمي كنه.

AmirGhasemi
سه شنبه 07 آذر 1391, 14:29 عصر
سلام
دوستان ما همان سه رقم سه رقم كردن در حين ورود اطلاعات داخل تكست باكس را هم بلد نيستيم
حالا شما لطف كن براي تكست باكس را اينجا بگذار ما دعا مي كنيم كه شما به حاجتتون برسيد
يا علي منتظريم

vistacali
سه شنبه 07 آذر 1391, 19:27 عصر
دوستان گرامی بیایید یک datagridview , 2 ta text box ,2 ta button رو روی فرم قرار بدید و کد های زیر رو یکی در دکمه اول و یکی را در دکمه دوم قرار بدهید ببینید جواب میده

کد اول که نوشتم ::: مشکلش اینه که باید بیایی و کد اسکی اعداد 0 تا 9 رو بریزی توی یک تابع و هر بار بایی عدد خونده شده از گرید رو با تابع مقایسه کنید و عملیات رو انجام بدی خوب من کد رو برای تست میزارم ببین این فقط برای عدد 0 جواب میده اصلاح کد با خودتون





//روش دستی
textBox1.Clear();
dataGridView1.SelectedCells[0].Value = ("000000000");
textBox1.Text = dataGridView1.SelectedCells[0].Value.ToString();
string s = textBox1.Text; int c = 0, b = 0, c1 = 0;

int[] numbers = new int[3];

for (int a = 0; a < s.Length; a++)
{
numbers[c1] = s[a];
c1++;
if (s[a] == 48)
{
C++‎;
if (c == 3)
{
for (b = 0; b < c; b++)
{
textBox2.Text = textBox2.Text + numbers[b];
}
c = 0;
c1 = 0;
textBox2.Text = textBox2.Text + ",";
}
}
}

dataGridView1.SelectedCells[0].Value = "";
dataGridView1.SelectedCells[0].Value = textBox2.Text;


------------------------------
اما شما چون میخواین هر بار سه رقم رو جدا کنید میشه از مضربی از 3 استفاده کرد و کد رو بهینه کرد و برای همه اعداد اعمال کرد البته این کد هم یه اصلاح کوچولو نیاز دار اونم باز با خودتون


//روش مضربی از 3

textBox1.Clear();
dataGridView1.SelectedCells[0].Value = ("123456789");
textBox1.Text = dataGridView1.SelectedCells[0].Value.ToString();
string s = textBox1.Text; int c = 0, b = 0, c1 = 0, a = 0;

for (a = 1; a <= s.Length; a++)
{
if (a % 3 == 0)
{
c = a;
for (b = c1; b < c; b++)
{
textBox2.Text = textBox2.Text + s[b];
}
c1 = a;
textBox2.Text = textBox2.Text + ",";
}
}
dataGridView1.SelectedCells[0].Value = "";
dataGridView1.SelectedCells[0].Value = textBox2.Text;



اما دوست خوبمون اقایAmirGhasemi این کد برای شما هم جواب میده فقط قسمت گرید ویووو را حذف کنید

دوستان مشکلی بود مطرح کنید

matin.soft
سه شنبه 07 آذر 1391, 20:33 عصر
از لينك زير استفاده نماييد:
http://barnamenevis.org/showthread.php?367891-کامپوننت-نمایش-مقادیر-پولی

plus
سه شنبه 07 آذر 1391, 20:45 عصر
private bool _isFormattingMoney = false;

private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
int notUsed;
//if (dataGridView1.CurrentCell.ColumnIndex == [Your Column Index]
//{
e.Control.TextChanged -= new EventHandler(Control_TextChanged);
e.Control.TextChanged += new EventHandler(Control_TextChanged);
e.Control.Text = FormatMoney(e.Control.Text, out notUsed);
// }
}

private void Control_TextChanged(object sender, EventArgs e)
{
int oldSelectionStart, selectionDifference;
TextBox control;

control = sender as TextBox;
if (control != null && _isFormattingMoney == false)
{
_isFormattingMoney = true;
oldSelectionStart = control.SelectionStart;
control.Text = FormatMoney(control.Text, out selectionDifference);
control.SelectionStart = oldSelectionStart + selectionDifference;
_isFormattingMoney = false;

}
}

private string FormatMoney(string money, out int selectionDifference)
{
StringBuilder formattedMoney;
int oldLength = money.Length;

selectionDifference = 0;
money = money.Replace(",", string.Empty);
selectionDifference = money.Length - oldLength;

formattedMoney = new StringBuilder();
for (int i = money.Length - 1, j = 0; i >=0; i--, j++)
{
formattedMoney.Insert(0, money[i]);
if (j == 2 && i != 0)
{
formattedMoney.Insert(0, ",");
selectionDifference++;
j = 0;
}
}

return formattedMoney.ToString();
}

دقت کنید متغیر _isFormattingMoney سراسری توی کلاس فرم تعریف شده.در ضمن من یک If نوشتم و کامنت کردم. در اون شرط شما باید بررسی کنید که اگه ستون در حال ویرایش ستون مورد نظرتون بود فقط عمل دسته بندی انجام بشه. نه برای همه ستون ها.

tara1367
سه شنبه 14 آذر 1391, 12:35 عصر
سلام
دوستان ما همان سه رقم سه رقم كردن در حين ورود اطلاعات داخل تكست باكس را هم بلد نيستيم
حالا شما لطف كن براي تكست باكس را اينجا بگذار ما دعا مي كنيم كه شما به حاجتتون برسيد
يا علي منتظريم


اين كد سه رقم سه رقم جدا كردن واسه textbox:
public void AllowThousandSeperator(TextBox tx)
{
if (tx.Text != "")
{
NumberFormatInfo nfi = new NumberFormatInfo();
nfi.NumberDecimalDigits = 0;
tx.Text = Int64.Parse(tx.Text, NumberStyles.AllowThousands).ToString("N", nfi);
tx.Select(tx.Text.Length, 0);
}
}


به تابع فوق باستي تكست باكس مربوطه را بفرستيد و اين تابع را در رويداد textchange تكست باكس فراخواني كنيد.