Frage

I have this method which SUM values in those textboxes, I wanted to improve it so if any of these textboxes is empty I would like to insert into it "0" but I didn't knew where to and what exactly put to make it work like I want. I have wondered about this for quiet long time, would someone suggest me something please ?

void vypocti_naklady()
    {
        double a, b,c,d,e,f,g,h;
        if (
            !double.TryParse(p_ub_s.Text, out a) ||
            !double.TryParse(p_poj_s.Text, out b) ||
            !double.TryParse(p_jin_s.Text, out c) ||
            !double.TryParse(p_dop_s.Text, out d) ||
            !double.TryParse(p_prov_s.Text, out e) ||
            !double.TryParse(p_pruv_s.Text, out f) ||
            !double.TryParse(p_rez_s.Text, out g) ||
            !double.TryParse(p_ost_s.Text, out h) 
        )
        {
            naklady.Text = "0";
            return;
        }

        naklady.Text = (a+b+c+d+e+f+g+h).ToString();
    }

Thanks everyone for their help and time.

War es hilfreich?

Lösung

You can make one textbox validated event (because if empty you just need to insert 0 and not retain focus),and subscribe all other textboxes to that textbox validated event.

For example: you have 5 textboxes subscribe (by clicking for example textbox1 properties window|events and double-click validated), and for the other textboxes subscribe their validated event to that one, then inside it put this:

private void textBox1_Validated(object sender, EventArgs e)
{
    if (((TextBox)sender).Text == "")
    {
        ((TextBox)sender).Text = "0";
    }
}

Andere Tipps

private double GetValue(string input)
{
  double val;

  if(!double.TryParse(input,out val))
  {
    return val;
  }

  return 0;
}

var sum = this.Controls.OfType<TextBox>().Sum(t => GetValue(t.Text));

Try the above. Just run an OfType on the parent of the text boxes (parent could be the form itself)

This will count any invalid input as 0

Try this:

// On the textboxes you want to monitor, attach to the "LostFocus" event.
textBox.LostFocus += textBox_LostFocus;

This monitors for when the TextBox has lost focus (has been clicked away from). When it has, then run this code:

static void textBox_LostFocus(object sender, EventArgs e) {
    TextBox theTextBoxThatLostFocus = (TextBox)sender;

    // If the textbox is empty, zeroize it.
    if (String.IsNullOrEmpty(theTextBoxThatLostFocus.Text)) {
        theTextBoxThatLostFocus.Text = "0";
    }
}

If effect you watch the TextBox.LostFocus event. Then when the use clicks away from the box, it will run textBox_LostFocus. If the TextBox is empty, then we replace the value with a zero.

An alternative would be not to use the TextBox text directly and parse it, but to databind to a property and use those instead. The Binding itself will do the parse and validation, leaving your variable always clean and ready for use.

public partial class Form1 : Form
{
    // Declare a couple of properties for receiving the numbers
    public double ub_s { get; set; }
    public double poj_s { get; set; }   // I'll cut all other fields for simplicity

    public Form1()
    {
        InitializeComponent();

        // Bind each TextBox with its backing variable
        this.p_ub_s.DataBindings.Add("Text", this, "ub_s");
        this.p_poj_s.DataBindings.Add("Text", this, "poj_s");
    }

    // Here comes your code, with a little modification
    private void vypocti_naklady()
    {
       if (this.ub_s == 0 || this.poj_s == 0 /*.......*/)
       {
           naklady.Text = "0";
           return;
       }
       naklady.Text = (this.ub_s + this.poj_s).ToString();
    }
}

You just work with properties, already safely typed as double and forget about formating and parsing. You may improve this by moving all that data to a ViewModel class and putting the logic there. Ideally, you can apply the same idea to the output TextBox by databinding to it too, but for that to work you must implement INotifyPropertyChanged so the bindings know when to update the UI.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top