0

我需要制作一个ListBox显示 aButton被点击的频率。

用户选择可以点击的按钮数量。这是我尝试过的:

int clicked;

clicked = int.Parse(((Button)(sender)).Text);

freq_array[clicked]++;

for (int i = 0; i < freq_array[clicked]; i++)
    lstFrequencies.Items[clicked] = clicked + "\t\t" + freq_array[clicked]; 

freq_array使用“clicked”变量来增加按钮被点击的频率。或者,它应该是。

当我调试它时,“点击”总是为 0。我希望“点击”等于被点击按钮的文本值。当我尝试运行该程序时,我收到一条错误消息,提示“输入字符串的格式不正确。”

编辑:

在你们的帮助下,我能够修复我的程序。我意识到我没有展示足够多的代码以使其足够清晰,对此我深表歉意。我不得不添加一些东西并移动一些东西并很快得到它。谢谢你们。

以下代码仅供将来可能需要帮助的人使用:

  public partial class Form1 : Form
{
    int[] freq_array = new int[11];
    int[] numList = new int[11];
    int oBase = 0;

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        invisiblity();
    }

    private void invisiblity()
    {
        foreach (Control ctrl in this.Controls)
        {
            if (ctrl is Button)
                if (Char.IsDigit(ctrl.Text[0]))
                    ctrl.Visible = false;
        }
    }

    private void btnSetBase_Click(object sender, EventArgs e)
    {
        Form2 frmDialog = new Form2();
        frmDialog.ShowDialog(this);

        if (frmDialog.DialogResult == DialogResult.OK)
        {
            oBase = frmDialog.Base;
            //lblOutDigits.Text = oBase.ToString();

            for (int i = 0; i < oBase; i++)
            {
                numList[i] = i;
            }
        }

        ShowBaseButtons(oBase);
    }

    private void ShowBaseButtons(int last_digit)
    {
        invisiblity();

        foreach (Control ctrl in this.Controls)
        {
            if (ctrl is Button)
                if (Char.IsDigit(ctrl.Text[0]))
                    if (int.Parse(ctrl.Text) <= last_digit - 1)
                        ctrl.Visible = true;
        }
    }

    private void btnN_Click(object sender, EventArgs e)
    {
        lblOutDigits.Text += ((Button)(sender)).Text;

        int clicked = int.Parse(((Button)(sender)).Text);

        freq_array[clicked]++;
    }

    private void btnShowFreq_Click(object sender, EventArgs e)
    {
        lstFrequencies.Items.Clear();

        for (int i = 0; i < oBase; i++)
        lstFrequencies.Items.Add(numList[i] + "  \t\t\t" + freq_array[i]);

    }
4

2 回答 2

0

只要您的按钮文本实际上只是一个数字,您的代码就应该可以工作。由于您要做的是创建索引,我通常做的是使用Tag控件的属性,将其设置为我想要在设计器中的索引,然后将其转换为 Int。

IE

if (int.TryParse(((Button)sender).Tag.ToString(), out clicked))
    freq_array[clicked]++;

我相信正在发生的事情是你没有初始化你的 ListBox,这个示例代码确实使用你的初始方法工作。只需创建一个新表单并将其粘贴并进行测试。

public partial class Form1 : Form
{
    ListBox lstFrequencies = new ListBox();
    int[] freq_array = new int[10];
    public Form1()
    {
        InitializeComponent();
        Size = new Size(400, 400);
        lstFrequencies.Location = new Point(150, 0);
        lstFrequencies.Size = new Size(150, 200);
        Controls.Add(lstFrequencies);
        int top = 0;
        for (int i = 0; i < 10; i++)
        {
            Button btn = new Button();
            btn.Size = new Size(70, 30);
            btn.Location = new Point(5, top);
            Controls.Add(btn);
            top += 35;
            btn.Tag = i;
            btn.Text = i.ToString();
            btn.Click += new EventHandler(btn_Click);
            lstFrequencies.Items.Add(i.ToString());
        }

    }

    void btn_Click(object sender, EventArgs e)
    {
        int clicked;

        clicked = int.Parse(((Button)(sender)).Text);

        freq_array[clicked]++;

        lstFrequencies.Items[clicked] = clicked + "\t\t" + freq_array[clicked]; //Cleaned up you do not need to iterate your list

        // Using my example code

        //if (int.TryParse(((Button)sender).Tag.ToString(), out clicked))
        //{
        //    freq_array[clicked]++;
        //    lstFrequencies.Items[clicked] = clicked + "\t\t" + freq_array[clicked];
        //} 
    }
}
于 2012-12-11T00:28:09.943 回答
0

您的代码始终为 0,因为您从未将上次单击的值分配给按钮文本。试试这个代码:

int clicked = 0;
private void button1_Click(object sender, EventArgs e)
{
    clicked = Convert.ToInt32(((Button)sender).Text);
    lstFrequencies.Items.Add(((Button)sender).Name + " " + ++clicked);
    button1.Text = clicked.ToString();  // you lose this line

}

编辑:来自变量成员的计数器

int clicked = 0;
private void button1_Click(object sender, EventArgs e)
{
   // if you want to display button name, change .Text to .Name
   lstFrequencies.Items.Add(((Button)sender).Text + " " + ++clicked);

}
于 2012-12-11T01:54:53.623 回答