• 0

C# Calculating textbox values?


Question

Hi,

I have an application with 20 textboxes, i need to do the calculations for example ((TextBox12 * TextBox1 * TextBox7) / 2) and display the result on label when clicking a button.

Ive usually done these like this:


private void lBtn_Click(object sender, EventArgs e)
{
double L, L2;
if (double.TryParse(kTb1.Text, out L) && double.TryParse(kTb2.Text, out L2))
lBl4.Text = String.Format("{0:f1}", (L2 * L));
else
MessageBox.Show("WTF?");
}
[/CODE]

I was wondering if there is better way to do this so that I don't have to add all 20 textboxes into this with && double.TryParse?

Link to comment
https://www.neowin.net/forum/topic/1083591-c-calculating-textbox-values/
Share on other sites

17 answers to this question

Recommended Posts

  • 0

You could add the text boxes into an array, and then iterate over the array...


private void lBtn_Click(object sender, EventArgs e) {
TextBox[] textboxes = {
kTb1,
kTb2,
kTb3,
...
kTb20
};

double temp = 0D, total = 0D;
bool isError = false;
foreach (TextBox tb in textboxes)
{
if (!double.TryParse(tb.Text, out temp))
{
isError = true;
break;
}

total *= temp
}

if (isError)
MessageBox.Show("WTF?");
else
lBl4.Text = String.Format("{0:f1}", total);
}
[/CODE]

To generate the array, you could create it in the form's constructor (or OnLoad event handler), and store it as a class variable...

[CODE]
TextBox[] m_textboxes;

protected void Form1_Load(Object sender, EventArgs e)
{
TextBox[] m_textboxes = {
kTb1,
kTb2,
kTb3,
...
kTb20
};
}
[/CODE]

If the only text boxes on the form are the ones you'll be using in the calculation, you could also use the Controls property to get the list of child text boxes :)

  • 0

I'd put the textboxes into a panel, iterate the panels controls where the type is a textbox, load the value into an object then use the object to output your requirements.

Agreed that this is the best way to go.

  • 0

An application with 20 textboxes sounds like a pain in the ass to begin with. That said, you can at least factor out repetitive code inside methods, for instance you could create an extension method for textboxes to get their value as a double:


public static double getValue(this TextBox txtBox) {
return double.Parse(txtBox.Text;)
}
[/CODE]

So your code can look like:

[CODE]
try {
lbl4.Text = string.Format("{0:f0}", txt1.getValue() * txt2.getValue() / 3);
}
catch (Exception) {
MessageBox.Show("WTF?");
}
[/CODE]

Btw double.Parse with a try-catch (rather than TryParse) is probably the best approach here, it's not like the cost of throwing an exception in this case was of any significance and it leads to cleaner code.

  • 0

An application with 20 textboxes sound like a pain in the ass to begin with. That said, you can at least factor out repetitive code inside methods, for instance you could create an extension method for textboxes to get their value as a double:


<snip>
[/CODE]

Btw double.Parse with a try-catch (rather than TryParse) is probably the best approach here, it's not like the cost of throwing an exception in this case was of any significance and it leads to cleaner code.

How does what you did eliminate repetitive code versus simply using a loop? Using an extension method seems a bit overkill.

  • 0

How does what you did eliminate repetitive code versus simply using a loop? Using an extension method seems a bit overkill.

Assuming he's doing some operation that involves getting the values of all textboxes indistinctly (like a sum or an average), a loop is the obvious solution, but from his code example I gathered he wants to do operations involving specific textboxes and is wondering how to avoid having to write the double.TryParse boilerplate every time. Maybe I just misinterpreted though, anyway the loop solution was already given by others here.
  • 0

Assuming he's doing some operation that involves getting the values of all textboxes indistinctly (like a sum or an average), a loop is the obvious solution, but from his code example I gathered he wants to do operations involving specific textboxes and is wondering how to avoid having to write the double.TryParse boilerplate every time. Maybe I just misinterpreted though, anyway the loop solution was already given by others here.

Actually yeah I see your point now; the first code snippet in the OP seems to suggest arbitrary calculations while the later code snippets suggest otherwise. Interesting.

  • 0

I wonder if the textboxes are the right way to do this afterall?

This application will have 50 textboxes and user inputs values 1-5. Two buttons, calculate and clear. After the calculations it shows a the results of 8 calculations and also a graph.

I first thought I do it with popup dialog but then decided to use textboxes so that user can check the entered values but it will have alot of textboxes...

Any ideas?

  • 0
I wonder if the textboxes are the right way to do this afterall? This application will have 50 textboxes and user inputs values 1-5. Two buttons, calculate and clear. After the calculations it shows a the results of 8 calculations and also a graph. I first thought I do it with popup dialog but then decided to use textboxes so that user can check the entered values but it will have alot of textboxes... Any ideas?
So the user has 5 values to enter and you want to display the result of 8 calculations. Why do you need 50 different fields for that?

I'm not too familiar with Winforms but if you have a lot of data it's usually better to display it with some kind of list control, perhaps DataGrid or ListView.

  • 0

So the user has 5 values to enter and you want to display the result of 8 calculations. Why do you need 50 different fields for that?

I'm not too familiar with Winforms but if you have a lot of data it's usually better to display it with some kind of list control, perhaps DataGrid or ListView.

I meant user needs to enter value 1-5 for every textbox.

  • 0

Ok so you have 8 different calculations that all require 5 inputs for the user and a field to display the result, if I understand correctly. So you could design a UserControl that has 5 input fields and a result field, and use that 8 times with a different equation passed in as a parameter. The equation could be a five-argument Func where the arguments are the 5 different textbox values. Does that make any sense for you?

  • Like 1
This topic is now closed to further replies.
  • Recently Browsing   0 members

    • No registered users viewing this page.
  • Posts

    • Plans. Christ at least editorialise this tripe for what it is or put your own journalistic take on it.
    • If you have a TV in your living room, chances are you can probably just use the Steam Link app and play your huge PC in big picture mode, effectively giving you the Steam Machine experience to see if you'd actually like it. The good news is the Steam Machine can have it's drives upgraded. It has a USB-C 10Gbs port as well, so the 512GB drive could be quickly moved to an external enclosure and repurposed.
    • This machine could very well be a second gaming PC for their living room as a console experience. So we would have to assume their main PC exists as well; With that said, I have 10gb home network with a 2.5gigabit internet connection here so we tend to have more than enough speed to download games. However, we can't make use of the 10gb LAN using Steam's built in transfer tool because it always compresses transfers and that slows the transfer down to well below a standard gigabit port speeds, sometimes as slow as 200-300Mb/s transfers. While that's probably still faster than most internet connections anyway, if they'd fix the LAN transfer issue it'd be upto x5 faster even on a gigabit LAN, than simply dropping a 2.5gbe port on there with hopes of a few people having fast internet connections. There are solutions, work arounds, like using LANCache if you run a NAS... or simply copying the files over manually using a network share.
    • Samsung announces ultra-fast UFS 5.0 storage to supercharge mobile AI by Paul Hill Local AI models tend to run a lot more slowly than cloud services like Claude and Gemini; however, Samsung has just announced that it has developed its UFS 5.0 solution, which increases data transfer to speeds of 10.8GB/s, enabling faster storage and processing in mobile memory that has the potential to provide more optimal local AI experiences. Commenting on this development, Jangseok Choi, head of Memory Product Planning at Samsung Electronics, said: If you’ve tried local AI, you’ll know it can be quite slow, especially if using the larger parameter models. By developing this new solution, Samsung says that storage is evolving from just storing data to a core piece of infrastructure that supports AI computation, too. The Korean company said that UFS 5.0 integrates the latest embedded memory interface standard from JEDEC and achieves up to 10.8 gigabytes per second (GB/s) transfer speeds. Regarding write speeds, Samsung UFS 5.0 can reach 9.5 GB/s. Both the read and write speeds are twice as fast as those of the previous UFS 4.1 standard. Aside from being ideal for local AI, Samsung’s UFS 5.0 is more power efficient by 40% compared to UFS 4.1. Samsung achieved this by implementing innovations such as clock gating and multi-voltage technologies. UFS 5.0 is also ultra-compact at just 7.5mm x 13mm x 0.9mm; that is 16.7% smaller than UFS 4.1. The company said it will be bringing it to multiple devices in the future, including mobile, wearable, and extended reality.
    • A bit like the steamdeck, this probably isn't for you.
  • Recent Achievements

    • Week One Done
      Almohandis earned a badge
      Week One Done
    • Rookie
      dorf went up a rank
      Rookie
    • First Post
      mike_rumble earned a badge
      First Post
    • Dedicated
      tuben earned a badge
      Dedicated
    • Week One Done
      mnsgroup earned a badge
      Week One Done
  • Popular Contributors

    1. 1
      +primortal
      496
    2. 2
      +Edouard
      209
    3. 3
      PsYcHoKiLLa
      99
    4. 4
      Michael Scrip
      86
    5. 5
      neufuse
      69
  • Tell a friend

    Love Neowin? Tell a friend!