0

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'変数を使用して、ボタンがクリックされた頻度を追加します。または、そうなるはずです。

デバッグすると、「クリック」は常に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 にキャストすることです。

すなわち

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 に答える