【问题标题】:Try catch arrays in windows form尝试以 windows 形式捕获数组
【发布时间】:2019-12-16 18:29:55
【问题描述】:

我正在制作一个 Windows 窗体应用程序,它采用各种游戏条目(标题、类型、价格),然后将它们存储在一个最多包含四个条目的数组中。我还有一个删除按钮来覆盖条目

我目前有 3 个错误我不确定是单独询问每个错误还是同时询问所有错误,但我会同时尝试所有错误

1.当使用删除按钮覆盖数组时,它会保持原始价格值,而不是更改为字符串并被列为已售出

2.当我使用游戏 2 的删除按钮删除第二个数组时,它会覆盖第一个数组,但是当被覆盖时,第三个和第四个数组可以正常工作

3.当用户在 tb 中输入小数以外的小数时,价格是小数,整个程序崩溃我该如何输入一个 try catch 语句来解决这个问题

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Microsoft.Win32;
using System.IO;

namespace gameForm
{
    public partial class gameEntryForm : Form
    {
        public gameEntryForm()
        {
            InitializeComponent();
        }

    struct Game
    {
        public string Title;
        public string Genre;
        public decimal Price;
    }

    static Game[] aNewGame = new Game[4]; //max size of the array is 4 

    static int newGameEntryIndex = 1;

    //bool full = true;

    private void gameEntryForm_Load(object sender, EventArgs e)
    {
        aNewGame[0].Title = "golf tour"; //this is a game already stored in the database
        aNewGame[0].Genre = "sports";
        aNewGame[0].Price = 1.99m;
    }

    private void btnSave_Click(object sender, EventArgs e)
    {

        if (String.IsNullOrEmpty(tbGenre.Text))
        {
            MessageBox.Show("please enter a Game genre.");
        }
        else if (String.IsNullOrEmpty(tbTitle.Text))
        {
            MessageBox.Show("please enter a Game title");
        }
        else if (String.IsNullOrEmpty(tbPrice.Text))
        {
            MessageBox.Show("please enter a Game price");
        }
        else
        {
            if (newGameEntryIndex >= 4)
            {
                MessageBox.Show("the game store is full");

            }
            else
            {
                aNewGame[newGameEntryIndex] = new Game();

                aNewGame[newGameEntryIndex].Title = tbTitle.Text;

                aNewGame[newGameEntryIndex].Genre = tbGenre.Text;

                aNewGame[newGameEntryIndex].Price = Convert.ToDecimal(tbPrice.Text);

                newGameEntryIndex++;

                MessageBox.Show("entry saved");

                //clears the text boxes 
                tbTitle.Clear();

                tbGenre.Clear();

                tbPrice.Clear();


            }
        }
    }
    private void btnShow_Click(object sender, EventArgs e)
    {
        rtbShow.Text = "Game Details \n\nGame 1 \n" + aNewGame[0].Title + "\n" + aNewGame[0].Genre + "\n" + aNewGame[0].Price + "\n\n" + "Game 2 \n" + aNewGame[1].Title + "\n" + aNewGame[1].Genre + "\n" + aNewGame[1].Price + "\n\n" + "Game 3 \n" + aNewGame[2].Title + "\n" + aNewGame[2].Genre + "\n" + aNewGame[2].Price + "\n\n" + "Game 4 \n" + aNewGame[3].Title + "\n" + aNewGame[3].Genre + "\n" + aNewGame[3].Price; ;
    }
    //clears the rich text box
    private void btnClear_Click(object sender, EventArgs e)
    {
        rtbShow.Clear();
    }
    private void btnQuit_Click(object sender, EventArgs e)
    {
        Application.Exit();
    }
    private void btnDelete_Click(object sender, EventArgs e)
    {
        if (!(cmbDelete.SelectedIndex == 1))
        {
            aNewGame[cmbDelete.SelectedIndex - 0].Title = "Sold";
            aNewGame[cmbDelete.SelectedIndex - 0].Genre = "Sold";
            aNewGame[cmbDelete.SelectedIndex - 0].Price.ToString("Sold");
        }
        else if (!(cmbDelete.SelectedIndex == 2))
        {
            aNewGame[cmbDelete.SelectedIndex - 1].Title = "Sold";
            aNewGame[cmbDelete.SelectedIndex - 1].Genre = "Sold";
            aNewGame[cmbDelete.SelectedIndex - 1].Price.ToString("sold");
        }
        else if (!(cmbDelete.SelectedIndex == 3))
        {
            aNewGame[cmbDelete.SelectedIndex - 2].Title = "Sold";
            aNewGame[cmbDelete.SelectedIndex - 2].Genre = "Sold";
            aNewGame[cmbDelete.SelectedIndex - 2].Price.ToString("sold");
        }
        else if (!(cmbDelete.SelectedIndex == 4))
        {
            aNewGame[cmbDelete.SelectedIndex - 3].Title = "Sold";
            aNewGame[cmbDelete.SelectedIndex - 3].Genre = "Sold";
            aNewGame[cmbDelete.SelectedIndex - 3].Price.ToString("sold");
        }
    }

 }

}

【问题讨论】:

  • ComboBox 中有多少条目?为什么要从 SelectedIndex 中减去一个常数? SelectedIndex 应该已经正确,以便将“已售”文本设置在 Game 数组中的正确位置
  • “也许是一个 try catch 语句来解决这个问题” - 不。你掩盖了真正的问题。以首先不需要尝试/捕获的方式处理此问题。您当然能够从异常中获得一些有用的信息,并且希望它应该足够明显。

标签: c# arrays forms user-interface try-catch


【解决方案1】:

首先,您可以为Show 按钮尝试类似的操作。我添加了内联 if 语句,因为您不能将 string 放入 decimal 对象中。所以我们将修改Delete按钮的行为。

private void btnShow_Click(object sender, EventArgs e)
{
    rtbShow.Text = "Game Details \n\n"
    for(int i = 0; i < aNewGame.Length; i++)
    {
        rtbShow.Text += Game " + i + 
            "\n" + aNewGame[i].Title + 
            "\n" + aNewGame[i].Genre + 
            "\n" + aNewGame[i].Price == Decimal.Zero ? "Sold" : aNewGame[i].Price;
    }
}

现在是Delete 按钮。而不是aNewGame[cmbDelete.SelectedIndex].Price.ToString("Sold");,因为这会产生语法错误,你应该像Xtros在他的回答中建议的那样做:

private void btnDelete_Click(object sender, EventArgs e)
{
    aNewGame[cmbDelete.SelectedIndex].Title = "Sold";
    aNewGame[cmbDelete.SelectedIndex].Genre = "Sold";
    aNewGame[cmbDelete.SelectedIndex].Price = Decimal.Zero;
}

请注意,我们将最后一行更改为将价格设置为Decimal.Zero。这样我们就可以正确显示已售出的游戏。

此代码未经测试,但它应该会提示您如何修复遇到的错误。

对于错误 3,您可以像这样执行tryParse 语句:

decimal temp;
aNewGame[newGameEntryIndex].Price = 
    Decimal.tryParse(tbPrice.Text, out temp)? temp : Decimal.Parse("0.00");

【讨论】:

    【解决方案2】:

    您在删除按钮单击中的逻辑做得太多,这可能导致您的前两个错误。

    如果他们点击删除第一项,假设 SelectedIndex 为 0,那么你应该可以调用:

    aNewGame[cmbDelete.SelectedIndex].Title = "Sold";
    

    注意:如果 SelectedIndex 为 1,则单击第一项,则需要减去一个。

    这将使您的点击事件如下所示:

    private void btnDelete_Click(object sender, EventArgs e)
    {
        aNewGame[cmbDelete.SelectedIndex].Title = "Sold";
        aNewGame[cmbDelete.SelectedIndex].Genre = "Sold";
        aNewGame[cmbDelete.SelectedIndex].Price.ToString("Sold");   // There's another bug here
    }
    

    【讨论】:

    • 对于“这里有另一个错误”的行,试着弄清楚那行有什么影响。它有什么作用?
    • 该行假设将小数转换为字符串以将其列为已售出
    • 它确实将小数转换为字符串...但是结果会怎样?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-25
    • 2017-09-12
    • 1970-01-01
    相关资源
    最近更新 更多