C#进度条不会显示值

C#进度条不会显示值,c#,progress-bar,C#,Progress Bar,在我的应用程序中,我需要一个进度条来显示植物生长的进度。这就是代码: private static Timer farmProgress; internal void initFarmProgTimer( int step, int max = 100 ) { farmProgress = new Timer(); farmProgress.Tick += new EventHandler(farmProgress_Tick);

在我的应用程序中,我需要一个进度条来显示植物生长的进度。这就是代码:

    private static Timer farmProgress;
    internal void initFarmProgTimer( int step, int max = 100 )
    {
        farmProgress = new Timer();
        farmProgress.Tick += new EventHandler(farmProgress_Tick);
        farmProgress.Interval = step; // in miliseconds
        farmProgress.Start();



    }
    private void farmProgress_Tick(object sender, EventArgs e)
    {
        if (increment >= 100)
        {
            // wait till user get plant
        }
        else
        {
            increment++;
            plantProgressBar.Value = increment;
        }
    }
这里调用
initFarmProgTimer
函数:

    public static System.Threading.Timer growTimer;
    public static void InitGrowTimer(int time, string name)
    {
        growTimer = new System.Threading.Timer(growTimer_Finished, null, time, Timeout.Infinite);
        plantActive = true;

        Menu menu = new Menu();
        menu.initFarmProgTimer(time / 100);
    }
请注意,调用此函数的类不是表单,而是定义函数的类是表单

有人知道我的错误是什么吗

编辑 下面是对InitGrowTimer函数的调用

    switch ( index )
        {
            case 0:
                currentPlant = wheat.name;
                plantQ = printPlantDatas("wheat");
                if (plantQ == true)
                {
                    InitGrowTimer(wheat.time, wheat.name);
                    wheat.planted++;
                }
                break;
        }
编辑: 添加了完整的Menu.cs和Farm.cs文件

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Forms;

namespace Civilisation
{
partial class Farm
{

    /* START PLANT DEFINITONS

        CONFIGUREABLE! You may edit the values used.

        Definition standards:
        private const string <plant>Name = "<plant>";           constant plant name string
        private const int <plant>EXP = <exp>;                   exp you get for harvesting
        private const int <plant>Time = <seconds> * 1000;       time measured in ms
    */

    public struct wheat
    {
        public const string name = "Wheat";
        public const int exp = 2;
        public const int time = 5 * 1000;
        public static int planted = 0;
    }
    public struct carrot
    {
        public const string name = "Carrot";
        public const int exp = 10;
        public const int time = 30 * 1000;
        public static int planted = 0;
    }
    public struct potatoe
    {
        public const string name = "Potatoe";
        public const int exp = 30;
        public const int time = 180 * 1000;
        public static int planted = 0;
    }

    public struct chili
    {
        public const string name = "Chili";
        public const int exp = 60;
        public const int time = 300 * 1000;
        public static int planted = 0;
    }






    public struct magicbeans
    {
        public const string name = "Magic XP Beans";
        public static int exp = 0;
        public const int time = 0;
        public static int planted = 0;
    }

    // END PLANT DEFINITIONS

    public static List<string> plants;
    public static void InitializeList()
    {
        plants = new List<string>();
        plants.Add("wheat");
        plants.Add("carrot");
        plants.Add("potatoe");
        plants.Add("chili");
        plants.Add("admin.magicxpbeans");
        plants.Add("cotton");
    }

    private static bool plantActive = false;
    private static string currentPlant;

    private static int playerLevel = 1;
    private static int playerEXP = 0;

    public static void levelUp()
    {
        if (playerLevel == 1)
        {
            if (playerEXP >= Program.level1)
            {
                playerLevel++;
                playerEXP -= Program.level1;
                MessageBox.Show("Congratulations! You have reached level " + playerLevel + " in farming! " + (Program.level2 - playerEXP) + "EXP to next level.\n", "Levelup!", MessageBoxButtons.OK);
            }
        }
        if (playerLevel == 2)
        {
            if (playerEXP >= Program.level2)
            {
                playerLevel++;
                playerEXP -= Program.level2;
                MessageBox.Show("Congratulations! You have reached level " + playerLevel + " in farming! " + (Program.level3 - playerEXP) + "EXP to next level.\n", "Levelup!", MessageBoxButtons.OK);
            }
        }
        if (playerLevel == 3)
        {
            if (playerEXP >= Program.level3)
            {
                playerLevel++;
                playerEXP -= Program.level3;
                MessageBox.Show("Congratulations! You have reached level " + playerLevel + " in farming! " + (Program.level4 - playerEXP) + "EXP to next level.\n", "Levelup!", MessageBoxButtons.OK);
            }
        }
        if (playerLevel == 4)
        {
            if (playerEXP >= Program.level4)
            {
                playerLevel++;
                playerEXP -= Program.level4;
                MessageBox.Show("Congratulations! You have reached level " + playerLevel + " in farming! " + (Program.level5 - playerEXP) + "EXP to next level.\n", "Levelup!", MessageBoxButtons.OK);
            }
        }
        if (playerLevel == 5)
        {
            if (playerEXP >= Program.level5)
            {
                playerLevel++;
                playerEXP -= Program.level5;
                MessageBox.Show("Congratulations! You have reached level " + playerLevel + " in farming! " + (Program.level6 - playerEXP) + "EXP to next level.\n", "Levelup!", MessageBoxButtons.OK);
            }
        }
        if (playerLevel == 6)
        {
            if (playerEXP >= Program.level6)
            {
                playerLevel++;
                playerEXP -= Program.level6;
                MessageBox.Show("Congratulations! You have reached level " + playerLevel + " in farming! " + (Program.level7 - playerEXP) + "EXP to next level.\n", "Levelup!", MessageBoxButtons.OK);
            }
        }
        if (playerLevel == 7)
        {
            if (playerEXP >= Program.level7)
            {
                playerLevel++;
                playerEXP -= Program.level7;
                MessageBox.Show("Congratulations! You have reached level " + playerLevel + " in farming! " + (Program.level8 - playerEXP) + "EXP to next level.\n", "Levelup!", MessageBoxButtons.OK);
            }
        }
        if (playerLevel == 8)
        {
            if (playerEXP >= Program.level8)
            {
                playerLevel++;
                playerEXP -= Program.level8;
                MessageBox.Show("Congratulations! You have reached level " + playerLevel + " in farming! " + (Program.level9 - playerEXP) + "EXP to next level.\n", "Levelup!", MessageBoxButtons.OK);
            }
        }
        if (playerLevel == 9)
        {
            if (playerEXP >= Program.level9)
            {
                playerLevel++;
                playerEXP -= Program.level9;
                MessageBox.Show("Congratulations! You have reached level " + playerLevel + " in farming! " + (Program.level10 - playerEXP) + "EXP to next level.\n", "Levelup!", MessageBoxButtons.OK);
            }
        }
    }

    public static System.Threading.Timer growTimer;
    public static void InitGrowTimer(int time, string name)
    {
        growTimer = new System.Threading.Timer(growTimer_Finished, null, time, Timeout.Infinite);
        plantActive = true;

        Menu menu = new Menu();
        menu.initFarmProgTimer(time / 100, time);
    }
    public static void plantCrop( int index )
    {
        bool plantQ;

        switch ( index )
        {
            case 0:
                currentPlant = wheat.name;
                plantQ = printPlantDatas("wheat");
                if (plantQ == true)
                {
                    InitGrowTimer(wheat.time, wheat.name);
                    wheat.planted++;
                }
                break;
            case 1:
                currentPlant = carrot.name;
                plantQ = printPlantDatas("carrot");
                if (plantQ == true)
                {
                    InitGrowTimer(carrot.time, carrot.name);
                    carrot.planted++;
                }
                break;
            case 2:
                currentPlant = potatoe.name;
                plantQ = printPlantDatas("potatoe");
                if (plantQ == true)
                {
                    InitGrowTimer(potatoe.time, potatoe.name);
                    potatoe.planted++;
                }
                break;
            case 3:
                currentPlant = chili.name;
                plantQ = printPlantDatas("chili");
                if (plantQ == true)
                {
                    InitGrowTimer(chili.time, chili.name);
                    chili.planted++;
                }
                break;
        }
    }

    private static int growTime = 0;
    private static int xpGained = 0;
    private static int timesPlanted = 0;
    private static void growTimer_Finished(object sender)
    {
        switch (currentPlant.ToLower())
        {
            case "wheat":
                Inventory.wheat.quant++;
                break;
            case "carrot":
                Inventory.carrot.quant++;
                break;
            case "potatoe":
                Inventory.potatoe.quant++;
                break;
            case "chili":
                Inventory.chili.quant++;
                break;
        }
        plantActive = false;
        MessageBox.Show("Your " + currentPlant + " is finished!", "Civilisation", MessageBoxButtons.OK, MessageBoxIcon.Information);
        currentPlant = "";
        playerEXP += xpGained;
    }

    public static bool printPlantDatas(string plant)
    {
        switch (plant.ToLower())
        {
            case "wheat":
                growTime = wheat.time;
                xpGained = wheat.exp;
                timesPlanted = wheat.planted;
                break;
            case "carrot":
                growTime = carrot.time;
                xpGained = carrot.exp;
                timesPlanted = carrot.planted;
                break;
            case "potatoe":
                growTime = potatoe.time;
                xpGained = potatoe.exp;
                timesPlanted = potatoe.planted;
                break;
            case "chili":
                growTime = chili.time;
                xpGained = chili.exp;
                timesPlanted = chili.planted;
                break;


            case "magicbeans":
                growTime = magicbeans.time;
                xpGained = magicbeans.exp;
                timesPlanted = magicbeans.planted;
                break;
            default:
                MessageBox.Show("FATAL ERROR\nThe plant is contained in the plant menu but not in the data printer!", "Civilisation", MessageBoxButtons.OK, MessageBoxIcon.Error);
                break;
        }
        var result = MessageBox.Show(currentPlant + " needs " + growTime / 1000 + " seconds to grow and gives " + xpGained + "EXP. You have so far harvested it " + timesPlanted + " times.\nDo you want to plant it?", "Plant Information", MessageBoxButtons.OKCancel, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);
        if ( result == DialogResult.OK )
        {
            return true;
        }
        if ( result == DialogResult.Cancel )
        {
            MessageBox.Show("Planting cancelled.", "Plant Information", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            return false;
        }
        else
        {
            MessageBox.Show("Planting cancelled.", "Plant Information", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            return false;
        }
    }
}
}

嗯?据我所知,我的问题没有得到回答,我在评论中提出的问题是解决问题的一部分。我阅读了指南,但很遗憾您不理解这里的问题。

这可能是一个跨线程问题,但很难理解您在这里的结构,什么调用
InitGrowTimer
?@RonBeyer编辑添加调用。顺便说一下,除了进度条应该增加的部分外,似乎一切都正常。在哪里定义了
increment
?您在表单中使用的是什么类型的
计时器
?使用的
time
值是多少(来自
smeat.time
但实际值是多少)?@RonBeyer增量是
farmProgress定时器之前的
private int
<代码>小麦。时间是一个常量int,值为
5000
(ms)。
using Civilisation.Forms;
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;

namespace Civilisation
{
public partial class Menu : Form
{
    public Menu()
    {
        InitializeComponent();
        initGoldTimer();
    }

    private void farmButton_Click(object sender, EventArgs e)
    {
        FarmForm farmform = new FarmForm();
        farmform.ShowDialog();
    }

    private void inventoryButton_Click(object sender, EventArgs e)
    {
        InventoryForm invform = new InventoryForm();
        invform.ShowDialog();
    }







    private static Timer loadCurrency;
    private void initGoldTimer ()
    {
        loadCurrency = new Timer();
        loadCurrency.Tick += new EventHandler(loadCurrency_Tick);
        loadCurrency.Interval = 100; // in miliseconds
        loadCurrency.Start();
    }
    private void loadCurrency_Tick(object sender, EventArgs e)
    {
        gold.Text = "Gold: " + Currency.gold;
        gems.Text = "Gems: " + Currency.gems;
    }


    private int increment = 0;

    private Timer farmProgress;
    public void initFarmProgTimer( int step, int max = 100 )
    {
        farmProgress = new Timer();
        farmProgress.Tick += new EventHandler(farmProgress_Tick);
        farmProgress.Interval = step; // in miliseconds
        farmProgress.Start();

        this.plantProgressBar.Maximum = max;

    }
    private void farmProgress_Tick(object sender, EventArgs e)
    {
        if (increment >= 100)
        {
            // wait till user get plant
            farmProgress.Stop();
            // MessageBox.Show("Hello!", "Testing...");
        }
        else
        {
            increment++;
            this.Invoke(new Action(() => {
                plantProgressBar.Value = increment;
            }));

        }
    }



    private static Timer mineProgress;
    private void initMineTimer()
    {
        mineProgress = new Timer();
        mineProgress.Tick += new EventHandler(mineProgress_Tick);
        mineProgress.Interval = 100; // in miliseconds
        mineProgress.Start();
    }
    private void mineProgress_Tick(object sender, EventArgs e)
    {

    }

}
}