Skip to main content

I maded one post about currency formating, and the question was answered, but I am now trying to put the system formatting within a field in a datagridview, so, I C# for me is more easy to make that, and I maded, but, When I tryed to make the same in Visual Cobol, I just got errors :(

My C# code is that, remambar, is based in that code: community.microfocus.com/.../10425.aspx

private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
e.Control.PreviewKeyDown -= Control_PreviewKeyDown;
e.Control.PreviewKeyDown = new PreviewKeyDownEventHandler(Control_PreviewKeyDown);
}

private void Control_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
var txtB = (TextBox)sender;

var myValue = txtB.Text.Replace(",", "").Replace("R$", "").Replace(".", "").TrimStart('0');
decimal ul;

if (Decimal.TryParse(myValue, out ul))
{
ul = ul / 100;
txtB.PreviewKeyDown -= new PreviewKeyDownEventHandler(Control_PreviewKeyDown);
txtB.Text = string.Format(System.Globalization.CultureInfo.CreateSpecificCulture("pt-BR"), "{0:C2}", ul);
txtB.PreviewKeyDown = new PreviewKeyDownEventHandler(Control_PreviewKeyDown);
txtB.Select(txtB.Text.Length, 0);
}

if (!TextIsValid(txtB.Text))
{
txtB.Text = "R$ 0,00";
txtB.Select(txtB.Text.Length, 0);
}
}

private bool TextIsValid(string myText)
{
var mn = new System.Text.RegularExpressions.Regex(@"^R\\$ ?([1-9]{1}[\\d]{0,2}(.[\\d]{3})*(,[\\d]{0,2})?|[1-9]{1}Drinks{0,}(,[\\d]{0,2})?|0(,[\\d]{0,2})?|(,[\\d]{1,2})?)$");
if (mn.IsMatch(myText))
return true;
else
return false;
}

But, the strange thing is, in that code, in C#, the formating of text not work so fine than in the textbox, why ?

I maded one post about currency formating, and the question was answered, but I am now trying to put the system formatting within a field in a datagridview, so, I C# for me is more easy to make that, and I maded, but, When I tryed to make the same in Visual Cobol, I just got errors :(

My C# code is that, remambar, is based in that code: community.microfocus.com/.../10425.aspx

private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
e.Control.PreviewKeyDown -= Control_PreviewKeyDown;
e.Control.PreviewKeyDown = new PreviewKeyDownEventHandler(Control_PreviewKeyDown);
}

private void Control_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
var txtB = (TextBox)sender;

var myValue = txtB.Text.Replace(",", "").Replace("R$", "").Replace(".", "").TrimStart('0');
decimal ul;

if (Decimal.TryParse(myValue, out ul))
{
ul = ul / 100;
txtB.PreviewKeyDown -= new PreviewKeyDownEventHandler(Control_PreviewKeyDown);
txtB.Text = string.Format(System.Globalization.CultureInfo.CreateSpecificCulture("pt-BR"), "{0:C2}", ul);
txtB.PreviewKeyDown = new PreviewKeyDownEventHandler(Control_PreviewKeyDown);
txtB.Select(txtB.Text.Length, 0);
}

if (!TextIsValid(txtB.Text))
{
txtB.Text = "R$ 0,00";
txtB.Select(txtB.Text.Length, 0);
}
}

private bool TextIsValid(string myText)
{
var mn = new System.Text.RegularExpressions.Regex(@"^R\\$ ?([1-9]{1}[\\d]{0,2}(.[\\d]{3})*(,[\\d]{0,2})?|[1-9]{1}Drinks{0,}(,[\\d]{0,2})?|0(,[\\d]{0,2})?|(,[\\d]{1,2})?)$");
if (mn.IsMatch(myText))
return true;
else
return false;
}

But, the strange thing is, in that code, in C#, the formating of text not work so fine than in the textbox, why ?

I got this to work by modifying the previous example to use a datagridview instead of a textbox control but to get the textbox control out of the current cell and use the same methods on it.

       class-id entercurrency.Form1 is partial
                 inherits type System.Windows.Forms.Form.
       
       working-storage section.
       01 txtBox type TextBox.
       method-id NEW.
       procedure division.
           invoke self::InitializeComponent
           goback.
       end method.

       method-id TextisValid private.
       procedure division using by value mytext as string
                          returning ret-bool as condition-value.
           declare money as type System.Text.RegularExpressions.Regex = 
              new System.Text.RegularExpressions.Regex("^\\$(\\d{1,3}(\\,\\d{3})*|(\\d ))(\\.\\d{2})?$")
           set ret-bool to money::IsMatch(mytext)
           goback.
       end method.
       

       method-id dataGridView1_EditingControlShowing final private.
       procedure division using by value sender as object e as type System.Windows.Forms.DataGridViewEditingControlShowingEventArgs.
           
           if DataGridView1::CurrentCellAddress::X = 1  
              set txtBox to e::Control as type TextBox
              if txtBox not = null
                 invoke txtBox::remove_TextChanged(new System.EventHandler(self::txtBox_TextChanged))
                 invoke txtBox::add_TextChanged(new System.EventHandler(self::txtBox_TextChanged))
              end-if
          end-if
       end method.

       method-id txtBox_TextChanged public.
       procedure division using by value sender as object e as type System.EventArgs.
        *>Remove previous formatting, or the decimal check will fail including leading zeros
           declare myvalue as string = 
           txtBox::Text::Replace(",", "")::Replace("$", "")::Replace(".", "")::TrimStart('0')
           declare ul as decimal
        *>Check we are indeed handling a number
           if type Decimal::TryParse(myvalue, ul)
              set ul to ul / 100
        *>Unsub the event so we don't enter a loop
              invoke txtBox::remove_TextChanged(new System.EventHandler(self::txtBox_TextChanged))
                            
        *>Format the text as currency
              set txtBox::Text to type 
              String::Format(type System.Globalization.CultureInfo::CreateSpecificCulture("en-US"), "{0:C2}", ul)
              invoke txtBox::add_TextChanged(new System.EventHandler(self::txtBox_TextChanged))
              invoke txtBox::Select(txtBox::Text::Length, 0)
           end-if
           declare goodToGo as condition-value = self::TextisValid(txtBox::Text)
           if not goodToGo
              set textBox1::Text to "$0.00"
              invoke txtBox::Select(txtBox::Text::Length, 0)
           end-if
           goback.
    
       end method.
       
       end class.