2013-06-05 4 views
2

У меня есть пользовательский класс кнопки, и когда я запускаю PerformClick для любой из моих пользовательских кнопок, ничего не происходит. Это код:PerformClick на пользовательской кнопке не работает

Декларация моего пользовательского класса

public class NonFocusButton : Button 
{ 
    public NonFocusButton() 
    { 
     SetStyle(ControlStyles.Selectable, false); 
    } 
} 

List<NonFocusButton> buttons = new List<NonFocusButton>(); 

Это p функция:

void p() 
{ 
    for (int i = 1; i <= 5; i++) 
    { 
     NonFocusButton aux = new NonFocusButton(); 
     aux.Font = new System.Drawing.Font("Britannic Bold", 15.75F,  
     System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, 
      ((byte)(0))); 
     aux.Size = new System.Drawing.Size(192, 43); 
     aux.UseVisualStyleBackColor = true; 
     aux.UseWaitCursor = false; 
     aux.Visible = false; 
     buttons.Add(aux); 
     this.Controls.Add(aux); 
    }    

    // button start 

    buttons[0].Location = new System.Drawing.Point(410, 168); 
    buttons[0].Text = "START GAME"; 
    buttons[0].Click += new System.EventHandler(this.button0_Click); 
} 

private void button0_Click(object sender, EventArgs e) 
{ 
    this.Close(); 
} 

buttons[0].PerformClick(); // will not work 
+1

Показать более полный код. Здесь недостаточно контекста, чтобы выяснить, где проблема ... –

ответ

2

Как кнопки объявлены и заполнены? Так оно и есть, и это работает.

// declaration 
List<Button> butons = new List<Button>(); 

// calling 
buttons.Add(new Button()); 
p(); 
buttons[0].PerformClick(); 

Edit:

Кнопка должен получить фокус, прежде чем он может быть нажата.
Почему бы не сделать что-то вроде:

button0_Click(buttons[0], EventArgs.Empty); 

или просто позвонить Close() где бы вы звоните PerformClick().

+0

Мне нужно выполнить щелчок на каждой кнопке, которую я создал, и надеялся, что PerformClick может работать. –

0

ButtonPerformClick исходный код:

public void PerformClick() { 
    if (CanSelect) { 
     bool validatedControlAllowsFocusChange; 
     bool validate = ValidateActiveControl(out validatedControlAllowsFocusChange); 
     if (!ValidationCancelled && (validate || validatedControlAllowsFocusChange)) 
     { 
      //Paint in raised state... 
      // 
      ResetFlagsandPaint(); 
      OnClick(EventArgs.Empty); 
     } 
    } 
} 

И CanSelect:

public bool CanSelect { 
    // We implement this to allow only AxHost to override canSelectCore, but still 
    // expose the method publicly 
    // 
    get { 
     return CanSelectCore(); 
    } 
} 

internal virtual bool CanSelectCore() { 
    if ((controlStyle & ControlStyles.Selectable) != ControlStyles.Selectable) { 
     return false; 
    } 

    for (Control ctl = this; ctl != null; ctl = ctl.parent) { 
     if (!ctl.Enabled || !ctl.Visible) { 
      return false; 
     } 
    } 

    return true; 
} 

Мое предположение относительно ограничения является Selectable флаг был использован вместо того, чтобы добавить еще один флаг управления, такие как AllowsPerformClick.

Вместо использования PerformClick вы можете использовать отражение, например.

MethodInfo methodOnClick = typeof(Button).GetMethod("OnClick", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic); 

// and then... 

methodOnClick.Invoke(myButton, new Object[] { EventArgs.Empty }); 
Смежные вопросы