2013-08-05 6 views
1
public class Simple : Form 
{ 
    public Simple() 
    { 
     Text = "Server Command Line"; 
     Size = new Size(800, 400); 
     CenterToScreen(); 
     Button button = new Button(); 
     TextBox txt = new TextBox(); 
     txt.Location = new Point (20, Size.Height - 70); 
     txt.Size = new Size (600, 30); 
     txt.Parent = this; 
     txt.KeyDown += submit; 
     button.Text = "SEND"; 
     button.Size = new Size (50, 20); 
     button.Location = new Point(620, Size.Height-70); 
     button.Parent = this; 
     button.Click += new EventHandler(sSubmit); 
    } 

    private void submit(object sender, KeyEventArgs e) 
    { 
     if (e.KeyCode == Keys.Enter) { 
      Console.WriteLine ("txt.Text");//How do I grab this? 
      Submit(); 
     } 
    } 
} 

Я пытаюсь получить доступ к txt.Text вне формы, а google также не помог. Как мне получить к нему доступ?Доступ к переменной формы вне метода

+0

'Console.WriteLine()' в winform? –

+0

См. Эту ссылку msdn для получения дополнительной информации об области видимости переменной. Http://msdn.microsoft.com/en-us/library/ms973875.aspx –

+0

@ Precious1tj довольно часто используется для устранения неполадок. –

ответ

1

Ваша переменная txt объявлена ​​в локальной области конструктора Simple(). Вы не сможете получить доступ к нему в любом месте вне этой области, как это делается в методе отправки.

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

Пример:

public class Simple : Form 
{ 
    //now this is field is accessible from any method of declared within this class 
    private TextBox _txt; 
    public Simple() 
    { 
     Text = "Server Command Line"; 
     Size = new Size(800, 400); 
     CenterToScreen(); 
     Button button = new Button(); 
     _txt = new TextBox(); 
     _txt.Location = new Point (20, Size.Height - 70); 
     _txt.Size = new Size (600, 30); 
     _txt.Parent = this; 
     _txt.KeyDown += submit; 
     button.Text = "SEND"; 
     button.Size = new Size (50, 20); 
     button.Location = new Point(620, Size.Height-70); 
     button.Parent = this; 
     button.Click += new EventHandler(sSubmit); 
} 

private void submit(object sender, KeyEventArgs e) 
{ 
    if (e.KeyCode == Keys.Enter) { 
     Console.WriteLine (_txt.Text);//How do I grab this? 
     Submit(); 
    } 
} 

}

+0

А, спасибо, это именно то, что мне нужно! –

1

Вы должны определить некоторую переменную txt из TextBox где-то в классе формы, это на самом деле делается автоматически дизайнера для вас, когда вы перетаскиваете-н-капли a TextBox от Toolbox на вашу форму. Эта переменная является экземпляром TextBox. Он должен быть инициализирован с использованием конструктора TextBox() и с некоторыми свойствами, как в вашем коде. Вы можете использовать эту переменную в области класса формы Simple. Он имеет свойство Text (типа string), которое может быть изменено или отображено для отображения. Чтобы получить доступ к свойству, используйте этот шаблон: [instance Name].[Property name]

public class Simple : Form 
{ 
    public Simple() 
    { 
    Text = "Server Command Line"; 
    Size = new Size(800, 400); 
    CenterToScreen(); 
    Button button = new Button(); 
    txt = new TextBox(); 
    txt.Location = new Point (20, Size.Height - 70); 
    txt.Size = new Size (600, 30); 
    txt.Parent = this; 
    txt.KeyDown += submit; 
    button.Text = "SEND"; 
    button.Size = new Size (50, 20); 
    button.Location = new Point(620, Size.Height-70); 
    button.Parent = this; 
    button.Click += new EventHandler(sSubmit); 
    } 
    TextBox txt; 
    private void submit(object sender, KeyEventArgs e) 
    { 
    if (e.KeyCode == Keys.Enter) { 
     Console.WriteLine (txt.Text); 
     Submit(); 
    } 
    } 
} 
+1

Не могли бы вы объяснить, что вы сделали для него, так что это видно? : P –

+0

@MohammadAliBaydoun добавил несколько очень простых объяснений, я не думаю, что это должно быть добавлено. OP должен сначала прочитать основную книгу о 'class' и' winforms'. –

+1

@KingKing Это может быть, но блок кода без объяснения или контекста того, что вы пытаетесь показать OP, является IMHO counter результативным. –

0

По умолчанию (и по уважительной причине) управления, созданные на формах с использованием конструктора являются частными. Вы можете изменить его на публичные, но лучшим решением было бы просто создать публичную собственность в Форме для ее раскрытия.

public string MyTextField { get { return txt.Text; } } 

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

Смежные вопросы