好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

C#在主窗口调用嵌入到主窗口中子窗口的TEXTBOX中的值

在 C# WinForms 中,主窗口调用嵌入子窗口中的 TextBox 值,需要通过 控件访问 或 数据绑定 实现。以下是具体方法和代码示例:

方法 1:直接访问子窗口控件

步骤 1:创建子窗口(UserControl 或 Form)

假设子窗口是一个 UserControl,包含一个 TextBox:

public partial class ChildControl : UserControl

{

    public ChildControl()

    {

        InitializeComponent();

    }

    // 公开 TextBox 的值

    public string TextBoxValue

    {

        get { return textBox1.Text; }

        set { textBox1.Text = value; }

    }

}

步骤 2:在主窗口中嵌入子窗口

public partial class MainForm : Form

{

    private ChildControl childControl;

    public MainForm()

    {

        InitializeComponent();

        // 动态添加子控件

        childControl = new ChildControl();

        childControl.Dock = DockStyle.Fill; // 填充布局

        this.Controls.Add(childControl);

    }

}

步骤 3:主窗口获取子窗口的 TextBox 值

private void btnGetValue_Click(object sender, EventArgs e)

{

    string value = childControl.TextBoxValue;

    MessageBox.Show($"子窗口的 TextBox 值: {value}");

}

方法 2:通过事件传递数据

子窗口定义事件

public partial class ChildControl : UserControl

{

    public event Action<string> TextBoxValueChanged;

    private void textBox1_TextChanged(object sender, EventArgs e)

    {

        TextBoxValueChanged?.Invoke(textBox1.Text);

    }

}

主窗口订阅事件

public MainForm()

{

    InitializeComponent();

    childControl = new ChildControl();

    childControl.TextBoxValueChanged += (value) => 

    {

        label1.Text = $"实时接收: {value}"; // 在主窗口显示子窗口的值

    };

    this.Controls.Add(childControl);

}

方法 3:数据绑定(MVVM 模式)

步骤 1:创建可绑定的数据模型

public class ChildViewModel : INotifyPropertyChanged

{

    private string _textValue;

    public string TextValue

    {

        get { return _textValue; }

        set

        {

            _textValue = value;

            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(TextValue)));

        }

    }

    public event PropertyChangedEventHandler PropertyChanged;

}

步骤 2:子窗口绑定数据

public partial class ChildControl : UserControl

{

    public ChildControl()

    {

        InitializeComponent();

        textBox1.DataBindings.Add("Text", ViewModel, "TextValue");

    }

    public ChildViewModel ViewModel { get; } = new ChildViewModel();

}

步骤 3:主窗口访问数据

private void btnGetValue_Click(object sender, EventArgs e)

{

    string value = childControl.ViewModel.TextValue;

    MessageBox.Show($"绑定的值: {value}");

}

方法 4:通过父窗口属性传递

子窗口暴露父窗口引用

public partial class ChildControl : UserControl

{

    public MainForm ParentForm { get; set; }

    private void textBox1_TextChanged(object sender, EventArgs e)

    {

        ParentForm?.UpdateFromChild(textBox1.Text);

    }

}

主窗口实现更新方法

public partial class MainForm : Form

{

    public MainForm()

    {

        InitializeComponent();

        var child = new ChildControl { ParentForm = this };

        this.Controls.Add(child);

    }

    public void UpdateFromChild(string value)

    {

        label1.Text = value; // 实时更新主窗口显示

    }

}

对比总结

方法 适用场景 优点 缺点

直接访问控件属性 简单父子窗口交互 代码直接,无需额外逻辑 破坏封装性,紧耦合

事件通知 需要实时响应子窗口变化 松耦合,支持多订阅 需手动管理事件订阅/取消

数据绑定 (MVVM) 复杂数据同步,遵循设计模式 高可维护性,适合大型项目 实现复杂度较高

父窗口引用 需要反向调用父窗口方法 直观 增加双向依赖

最佳实践建议

简单场景:使用方法 1(直接访问属性)或方法 2(事件)。

解耦需求:优先选择方法 2(事件)或方法 3(数据绑定)。

避免直接暴露控件:尽量通过属性/方法封装子窗口的内部控件。

通过以上方法,主窗口可以安全、高效地获取或监听子窗口中的 TextBox 值。


查看更多关于C#在主窗口调用嵌入到主窗口中子窗口的TEXTBOX中的值的详细内容...

  阅读:9次