在 C# 中从另一个类访问 UI 表单控件到主表单中

问题描述 投票:0回答:3

如何使用另一个类中的 UI 表单控件?我想在另一个类中使用这些控件,然后将其调用到我的主窗体中。问题是我创建的新类似乎无法访问这些控件的标签或文本框,并且我不断收到错误。

我该如何解决这个问题?

错误信息:

FirstName_text 由于其保护级别而无法访问

First_Name_label 由于其保护级别而无法访问

当前上下文中不存在颜色

public void Checker() 
{
    //First Name Validation
    if (Regex_Static_Class.FirstNameRgex.IsMatch(FirstName_text.Text) == false)      
    {
        First_Name_label.Text = "invalid first name";
        Error_Lable.ForColor = Color.Pink;     
    }
}
c# .net class controls visibility
3个回答
0
投票

我猜 First_Name_label 是一个 UI 标签,它也必须可以从您的其他类访问。

也许制作一个 setter 方法来将文本填充到标签中。


0
投票

我想说,您必须在 Forms Designer 中将控件的

Modifiers
属性设置为
public
internal 才能从另一个类访问它。控件的实例默认受到保护。

这就是你问题的答案。另一件事是,这样做并不是最好的主意。您不应该直接访问表单之外的表单控件。 例如,表单类应该封装其控件并公开一个接口来更改它们。

另外

Color

 不存在很可能是因为您在另一个班级中没有适当的 
using

它与条件无关(引用从原始问题中删除的条件)。


0
投票
使用 FormCollection 执行迭代

使用FormCollection保存所有现在和将来打开的表单,这些打开的表单可以通过Tag Name访问。以免说要访问的表单是 Form1,文本框和标签标记名称是“FirstName_text”和“First_Name_label”。

// All open forms in your application will be placed in fcOpenForms. FormCollection fcOpenForms = Application.OpenForms; // Perform iteration for the form to be accessed by it's tag name. foreach(Form fOpenForm in fcOpenForms.OfType<Form>().ToList()) { if(fOpenForm.Tag != null && fOpenForm.Tag.Equals("Form1")) { //Now iterate for the textbox tag name. // foreach(TextBox tFirstNameTextBox in fOpenForm.Controls.OfType<TextBox>().ToList()) { if(tFirstNameTextBox.Tag != null && tFirstNameTextBox.Tag.Equals("FirstName_text")) { //Now iterate for the label's tag names. // foreach(Label lFirstNameLabel in fOpenForm.Controls.OfType<Label>().ToList()) { if(lFirstNameLabel.Tag != null && lFirstNameLabel.Tag.Equals("First_Name_label")) { // You can now access these two controls "FirstName_text" and // "First_Name_label" by calling it's variable name not the controls name. // tFirstNameTextBox.Text = "Your Text Here"; lFirstNameLabel.Text = "invalid first name"; // Any other control can be accessed using the same technique. You can either iterate // for "Error_Label" here or up under where "First_Name_label" was accessed, it depends // on where you see fit, to suite your needs at the time of accessing these controls in //your application. foreach(Label lErrorLabel in fOpenForms.Controls.OfType<Label>().ToList()) { if(lErrorLabel .Tag != null && lErrorLabel .Tag.Equals("Error_Lable")) { lErrorLabel.ForColor = Color.Pink; } } } } } } } }
如果任何控件驻留在正在访问的表单的子容器中,则必须先分别访问该子容器,然后才能访问控件,例如组框,例如foreach(fOpenForms 中的 GroupBox gGroupBox) 然后 foreach(gGroupBox.Controls 中的 Control cChildControl) 等。
希望这有帮助...

© www.soinside.com 2019 - 2024. All rights reserved.