美文网首页
WPF在子窗口中动态添加控件,回传输入值

WPF在子窗口中动态添加控件,回传输入值

作者: Ritchie_Li | 来源:发表于2022-08-24 21:28 被阅读0次

有这样一个需求,类似从一个Excel表格筛选符合条件的行,如果列字段被标记为手动输入,则需要弹出窗口让工人输入,关键是手动输入的列字段不是确定数量的,可能是一个,也有可能是十个,也有可能一百个,不可能每种情况都创建一个对应输入窗口,只能依据参数个数,动态添加控件。

1. 在当前窗口动态添加2个文本控件

效果如下:

实现代码:

            //添加第一个文本框

            TextBox tb1 = new TextBox();

            tb1.Name = "myTextBox1";

            tb1.Text = "第一个文本框";

            tb1.Width = 150;

            tb1.Height = 50;

            tb1.HorizontalAlignment = HorizontalAlignment.Left;

            tb1.VerticalAlignment = VerticalAlignment.Top;

            tb1.Margin = new Thickness(10, 10, 0, 0);

            gdTest.Children.Add(tb1);

            //添加第二个文本框

            TextBox tb2 = new TextBox();

            tb2.Name = "myTextBox2";

            tb2.Text = "第二个文本框";

            tb2.Width = 150;

            tb2.Height = 50;

            tb2.HorizontalAlignment = HorizontalAlignment.Left;

            tb2.VerticalAlignment = VerticalAlignment.Top;

            tb2.Margin = new Thickness(10, 100, 0, 0);

            gdTest.Children.Add(tb2);

2. 访问动态添加的文本框的内容

            //访问添加的全部文本框

            foreach (var c in gdTest.Children)

            {

                if (c is TextBox)

                {

                    TextBox tb = (TextBox)c;

                    if (tb.Name == "myTextBox1")

                    {

                        MessageBox.Show($"第一个文本框:{tb.Text}");

                    }

                    else if (tb.Name == "myTextBox2")

                    {

                        MessageBox.Show($"第二个文本框:{tb.Text}");

                    }

                }

            }

输出:

3. 获取指定文本框的内容

假如需要第2个文本框的内容,只需要在上步骤中限定文本框名称即可。

    foreach (var c in gdTest.Children)

            {

                if (c is TextBox)

                {

                    TextBox tb = (TextBox)c;

                    if (tb.Name == "myTextBox2")

                    {

                        MessageBox.Show(tb.Text);

                    }

                }

            }

效果:

4. 创建一个输入窗口,动态创建参数名和参数值

关闭窗口回传输入的值:

参数输入窗口:

public partial class SubWindow : Window

    {

        public SubWindow()

        {

            InitializeComponent();

        }

        private List<string> parName = new List<string>();

        public SubWindow(int parameCount, List<string> parameName)

        {

            InitializeComponent();

            parName = parameName;

            for (int i = 0; i < parameCount; i++)

            {

                Label lbl = new Label();

                lbl.Content = parameName[i];

                lbl.FontSize = 14;

                lbl.HorizontalAlignment = HorizontalAlignment.Left;

                lbl.VerticalContentAlignment = VerticalAlignment.Top;

                lbl.Margin = new Thickness(20, 8 + i * 30, 0, 0);

                gd.Children.Add(lbl);

                TextBox tb1 = new TextBox();

                tb1.Name = parameName[i];

                tb1.Text = $"第{i}个文本框";

                tb1.Width = 300;

                tb1.Height = 25;

                tb1.KeyDown += Tb1_KeyDown;

                tb1.HorizontalAlignment = HorizontalAlignment.Left;

                tb1.VerticalAlignment = VerticalAlignment.Top;

                tb1.Margin = new Thickness(130, 10 + i * 30, 0, 0);

                gd.Children.Add(tb1);

                tb1.Focus();

            }

        }

        private void Tb1_KeyDown(object sender, KeyEventArgs e)

        {

            if (e.Key == Key.Enter)

            {

                string next = "";

                TextBox tb = sender as TextBox;

                int index = parName.IndexOf(tb.Name);

                if (index < parName.Count - 1)

                {

                    next = parName[index + 1];

                }

                else

                {

                    this.Close();

                }

                foreach (var t in gd.Children)

                {

                    if (t is TextBox)

                    {

                        TextBox textbox = (TextBox)t;

                        if (textbox.Name == next)

                        {

                            textbox.Focus();

                        }

                    }

                }

            }

        }

    }

使用方式:

List<string> names = new List<string> { "SAP", "OrderNr", "Test", "COUNT" };

            SubWindow wnd = new SubWindow(names.Count, names);

            wnd.ShowDialog();

            Dictionary<string, string> parameValueDict = new Dictionary<string, string>();

            foreach (var item in wnd.gd.Children)

            {

                if (item is TextBox)

                {

                    TextBox tb = (TextBox)item;

                    parameValueDict[tb.Name] = tb.Text;

                }

            }

            foreach (var item in parameValueDict)

            {

                txtMessage.AppendText($"{item.Key} --{item.Value}\n");

            }

5. 动态创建20个参数和演示值

private void btnDmeoAdd20_Click(object sender, RoutedEventArgs e)

        {

            List<string> Names = new List<string>();

            for (int i = 0; i < 20; i++)

            {

                Names.Add($"MyVarName{i}");

            }

            SubWindow wnd = new SubWindow(Names.Count, Names);

            wnd.ShowDialog();

            Dictionary<string, string> parameValueDict = new Dictionary<string, string>();

            foreach (var item in wnd.gd.Children)

            {

                if (item is TextBox)

                {

                    TextBox tb = (TextBox)item;

                    parameValueDict[tb.Name] = tb.Text;

                }

            }

            foreach (var item in parameValueDict)

            {

                txtMessage.AppendText($"{item.Key} --{item.Value}\n");

            }

        }

效果如下:

关闭窗口后回传输入值:

相关文章

  • WPF在子窗口中动态添加控件,回传输入值

    有这样一个需求,类似从一个Excel表格筛选符合条件的行,如果列字段被标记为手动输入,则需要弹出窗口让工人输入,关...

  • React专题4: 组件间通信

    父控件 传值 给子控件, 父控件可以将值 赋给子控件的一个属性(属性赋值)子控件 传值 给父控件, 需要父控件将自...

  • react-native 组件传值

    顺传通过props传值 举个?:父控件给子控件传递一个name属性的值,子控件展示父控件传递过来的值: // 子组...

  • 基于C++的为窗体增加TAB页和动态添加控件

    VC++为窗体增加TAB页和动态添加文本输入控件,这个例子中有如何添加动态TAB页的演示,还有动态添加控件的演示,...

  • Vue 父子组件传值

    一 、 向下传值(父传子) 注意: 传值方式为[:子控件属性= 父控件数据]子控件接收: 二 、 向上传值(父...

  • WPF中动态创建和删除控件

    WPF中动态创建和删除控件 2012-04-25 15:30阅读:1,949 动态创建控件 1.容器控件.Regi...

  • WPF-Window数据回调

    在开发WPF应用的时候,经常会碰到这样的场景,点击主窗口上的某个按钮,将弹出一个子窗口,在子窗口中有输入框,输入完...

  • RN学习-数据传递

    顺传(父传子) props 通过ref拿到控件给控件传值,ref="son"拿到子类 逆传(子传父) 在父组件中定...

  • 我想快速给WPF程序添加托盘菜单

    我想快速给WPF程序添加托盘菜单 1 简单要求: 使用开源控件库 在XAML中声明托盘菜单,就像给控件添加Cont...

  • vue中父子组件传值(通俗易懂)

    1.父子组件传值 首先我要说的是父组件如何向子组件传值传的值分为静态值和动态值 1.传静态值 2.传动态值 当然,...

网友评论

      本文标题:WPF在子窗口中动态添加控件,回传输入值

      本文链接:https://www.haomeiwen.com/subject/kuiogrtx.html