Частота нажатия кнопки Массив

Мне нужно сделать ListBox это показывает, как часто Button нажата.

Пользователь выбирает, сколько кнопок доступно для нажатия. Вот что я попробовал:

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, чтобы добавить к частоте нажатия кнопки. Или это должно быть.

Когда я отлаживаю его, "clicked" всегда получается равным 0. Я хочу, чтобы "clicked" равнялся текстовому значению кнопки, на которую нажали. Когда я пытаюсь запустить программу, я получаю сообщение об ошибке "Входная строка была в неправильном формате".

Редактировать:

Я смог исправить мою программу с помощью вас, ребята. Я понял, что недостаточно показал свой код, чтобы быть достаточно ясным, и я извиняюсь за это. Я должен был добавить некоторые вещи и переместить вещи и получил это достаточно скоро. Спасибо вам всем.

Вот код только для тех, кому может понадобиться помощь в будущем:

  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]);

    }

2 ответа

Ваш код должен работать до тех пор, пока текст кнопки на самом деле является просто числом. Поскольку вы пытаетесь создать индекс, я обычно использую Tag Свойство элемента управления, установите его в индекс, который я хочу в конструкторе, а затем приведите его к Int.

т.е.

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];
        //} 
    }
}

Ваш код всегда обнуляется, потому что вы никогда не назначаете последнее нажатие на текст кнопки. Попробуйте этот код:

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);

}
Другие вопросы по тегам