2012-12-11 7 views
0

Button이 클릭되는 빈도를 표시하는 ListBox을 만들어야합니다.버튼 클릭 주파수 배열

사용자가 클릭 할 수있는 단추 수를 선택합니다. 여기에 내가 무엇을 시도했다입니다 :

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으로 출력됩니다. '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]); 

    } 
+0

에서 단추 레이블는 숫자 코드를 시도? 그렇지 않으면 숫자로 변환하려고 할 때 문제가 있습니다. 단추 텍스트의 값에 대한 로그를 작성하여 처리중인 내용을 정확히 확인하고 이미 사용하고 있지 않은 경우 해시 테이블로 전환하는 것을 고려하십시오. – RonaldBarzell

+0

버튼의 텍스트는 무엇입니까? – caesay

+0

모든 단추는 0 - 10의 숫자입니다. – Bex

답변

0

코드는 한 당신의 단추 텍스트가 실제로 단지 숫자로 작동합니다. 당신이하려고하는 것은 인덱스를 만드는 것이므로, 일반적으로 컨트롤의 Tag 속성을 사용하여 디자이너에서 원하는 인덱스로 설정 한 다음이를 Int로 캐스팅합니다.

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

내가 무슨 일이 일어나고 것은 당신이 당신의 목록 상자를 초기화하지 않는 것입니다 생각,이 예제 코드가 작동 초기 방법을 사용하여 작업을 수행합니다. 새 양식을 만들고 붙여 넣기 만하면됩니다.

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

"개체가 개체의 인스턴스로 설정되지 않았습니다." 이 오류 메시지가 나타납니다. 나는 같은 꼬리표를 가진 각 단추가있다. – Bex

+0

@Bex 제 조정을 참조하십시오. 나는 그것이 작동하지 않는다는 것을 깨달았습니다. –

+0

동일한 오류가 있습니다. 아마도 나는 다른 것을 바꿔야 만합니다 ... – Bex

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

} 
+0

그는 버튼 텍스트를 바꾸고 싶지 않습니다. 텍스트는 증가 할 값을 알 수 있도록 색인 일뿐입니다. –

+0

그는 "디버깅 할 때 '클릭'은 항상 0으로 나옵니다. ** 클릭 한 버튼의 텍스트 값과 같게하려면 '클릭하십시오.' ' ** 카운터 입력은 텍스트 버튼 **에서 시작한다고 가정합니다. 죄송합니다. 질문에 대해 오해 한 경우. –

+0

왜 혼란 스러울 지 알 수 있습니다. 코드를 자세히 살펴보면 실제로 인덱스로 사용됩니다. 색인은 아마도 더 알기 쉬운 이름 일 것입니다. –