2014-12-14 3 views
0

У меня есть класс, который создает специальный вид сообщений. В этом классе один из аргументов - это переменная, которую я ссылаюсь на конструктор. Однако мне нужно, чтобы эта переменная была распознана из конструктора, а точнее, когда я нажимаю кнопку.Как отредактировать значение переменной внутри метода button_click

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

static void SetString1(ref string value) 
{ 
if (value == "cat") // Test parameter value 
{ 
    Console.WriteLine("Is cat"); 
} 
value = "dog"; // Assign parameter to new value 
} 

Я хочу сделать то же самое, но в методе нажатия кнопки, однако, если я пытаюсь передать переменную'variavelcaixa', это даст мне «Нет перегрузки buttonRight_click не соответствует делегируют System.EventHandler». Что это значит и как я должен успешно передать переменную?

private void buttonRight_Click(object sender, System.EventArgs e, ref int variavelcaixa) 
    { 
     if (checkBox1.Checked == true) 
     { variavelcaixa = 1; } 
     else { variavelcaixa = 0; } 
    } 

EDIT: код я имею в специальном классе окна сообщения выглядит следующим образом:

 public partial class BetterDialog : Form 
    { 
    public int variavelcaixa; 
static public DialogResult ShowDialog(string title, string largeHeading, string smallExplanation, 
     string leftButton, string rightButton, Image iconSet, ref int variavelcaixa) 
    { 
     using (BetterDialog dialog = new BetterDialog(title, largeHeading, smallExplanation, leftButton, 
      rightButton, iconSet, ref variavelcaixa)) 
     { 
      DialogResult result = dialog.ShowDialog(); 
      return result; 
     } 
    } 

    /// <summary> 
    /// The private constructor. This is only called by the static method ShowDialog. 
    /// </summary> 
    private BetterDialog(string title, string largeHeading, string smallExplanation, 
     string leftButton, string rightButton, Image iconSet, ref int variavelcaixa) 
    { 
     this.Font = SystemFonts.MessageBoxFont; 
     this.ForeColor = SystemColors.WindowText; 

     InitializeComponent(); 
    //A bunch of graphic design 
    } 

вне конструктора есть способ нажатия кнопки

private void buttonRight_Click(object sender, System.EventArgs e) 
    { 
     if (checkBox1.Checked == true) 
     { variavelcaixa = 1; } 
     else { variavelcaixa = 0; } 
    } 

На основной класс я просто добавляю ref variavelcaixa, с определенной переменной, прикрепленной к объекту окна сообщения

MsgBoxCheck.MessageBox dlg = new MsgBoxCheck.MessageBox(); 
       string icone = "C:\\warning.png"; 
       DialogResult result = BetterDialog.ShowDialog("Alert", 
     "main message in message box", 
     "some secondary message", 
     "", "Ok", System.Drawing.Bitmap.FromFile(icone), ref Variables.checkbox53naomostrarnovamente); 
+0

Вы фактически не назначаете переменную, даже если вы передаете ее как 'ref'. Одноименное имя в параметре и переменной не будет автоматически присваивать значение. –

+0

@ shree.pat18 Так как я могу связать их? – ng80092b

+0

Назначьте переменную в 'ShowDialog'! –

ответ

1

Обработчик события нажатия кнопки должен иметь подпись функции (object sender, System.EventArgs e)MSDN Reference. Вот почему, когда вы пытаетесь сделать свой обработчик в третьем параметре, возникает ошибка.

Один из способов обойти это - сделать переменную variavelcaixa доступной для метода обработчика. Вы можете сделать это, объявив его глобальной переменной в своем классе. Затем вы можете назначить его в конструкторе, а также в методе обработчика событий. Обратите внимание, что как только вы это сделаете, вы не должны передавать ref int variavelcaixa методу обработчика событий.

В принципе, как только вы вызываете showDialog и передаете параметр ref, вам необходимо назначить его переменной класса variavelcaixa в теле метода. ref Variables.checkbox53naomostrarnovamente будет ссылаться на checkbox53naomostrarnovamente, а не на вашу переменную. Поэтому изменить свой код на этот:

static public DialogResult ShowDialog(string title, string largeHeading, string smallExplanation, string leftButton, string rightButton, Image iconSet, ref int p_variavelcaixa) 
{ 
    using (BetterDialog dialog = new BetterDialog(title, largeHeading, smallExplanation, leftButton, 
     rightButton, iconSet, ref p_variavelcaixa)) 
    { 
     variavelcaixa = p_variavelcaixa; 
     DialogResult result = dialog.ShowDialog(); 
     return result; 
    } 
} 

Обратите внимание, что я переименовал свой параметр ref в p_variavelcaixa, чтобы помочь прояснить путаницу. Вы можете также взглянуть на this demo для понимания объекта переменной - параметра.

+0

Это простой выход, и я попытался это сделать, но даже с этим он не узнал значение переменной, хотя код работал без ошибок. Я пытаюсь добавить эту переменную в качестве дополнительного аргумента в следующем коде http://www.dotnetperls.com/customized-dialog – ng80092b

+0

В этой ссылке есть тонна кода, на что вы ссылаетесь? Кроме того, вы можете опубликовать код, который вы написали, с моим предлагаемым подходом, чтобы мы могли видеть, что с ним не так. –

+0

Я добавил код в редакцию, и в классе ящика сообщений variavelcaixa обнародовано конечно :) – ng80092b