2018-10-23 13:51:32 larry1648637120 阅读数 467
  • C#Winform窗体与界面设计

    本课程是针对C#Winform开发人员的基础性课程,详尽的介绍C#Winform窗体与界面的设计,通过提供实例,让C#Winform开发人员掌握相关程序设计技巧,为后面学习完整的实战课程打下较好的基础。

    5289 人正在学习 去看看 武占文
2013-01-10 15:59:00 iteye_2935 阅读数 143
  • C#Winform窗体与界面设计

    本课程是针对C#Winform开发人员的基础性课程,详尽的介绍C#Winform窗体与界面的设计,通过提供实例,让C#Winform开发人员掌握相关程序设计技巧,为后面学习完整的实战课程打下较好的基础。

    5289 人正在学习 去看看 武占文

1. 父窗体给子窗体传值

 

点击父窗体的Button 打开子窗体后,将父窗体的属性值传给子窗体 

可以调用重载子窗体的构造函数 直接传入相关数值

 

举例:(在一个项目中用到的实例)

 

public 修改规则()
        {
            InitializeComponent();
        }

        //父窗体传值给子窗体
        public 修改规则(int ruleId,int equipmentId,String equipmentName,String propertyName,int ruleType,String ruleRequest,String ruleRequestOther,String ruleExplain)
        {
            InitializeComponent();
            try {
                this.textBox1.Text = ruleId.ToString();
                this.textBox3.Text = equipmentId.ToString();
                this.textBox2.Text = equipmentName;
                if (ruleType==1)
                {
                    this.comboBox5.Text = "范围匹配类型";
                }
                else if (ruleType == 2)
                {
                    this.comboBox5.Text = "标准格式类型";
                }
                else if (ruleType == 3)
                {
                    this.comboBox5.Text = "精确描述类型";
                }
                else if (ruleType == 4)
                {
                    this.comboBox5.Text = "逻辑关联类型";
                }
                else
                {
                    this.comboBox5.Text = "无";
                }
                this.textBox4.Text = propertyName;
                this.textBox5.Text = ruleRequest;
                this.textBox6.Text = ruleRequestOther;
                this.textBox7.Text = ruleExplain;
 
            }catch(Exception ex){
                Console.WriteLine(ex);
            }
            
            
        }
2. 子窗体给父窗体传值
点击父窗体后弹出子窗体,在子窗体选择一系列属性值后,将选择的值传给父窗体
一个在项目中用到的例子:
子窗体代码:
private void button1_Click(object sender, EventArgs e)
        {
            规则配置 form = (规则配置)this.Owner;
            form.TextValue = getRadioButton(panel1);
            this.Close();
        }
 父窗体代码:
属性选择 form = new 属性选择(this.textBox2.Text.Trim() + "$",text_list.Count,text_list);
                    form.Owner = this;
                    form.ShowDialog();
                    this.textBox4.Text = textValue;
 
2015-05-29 11:54:57 honantic 阅读数 8768
  • C#Winform窗体与界面设计

    本课程是针对C#Winform开发人员的基础性课程,详尽的介绍C#Winform窗体与界面的设计,通过提供实例,让C#Winform开发人员掌握相关程序设计技巧,为后面学习完整的实战课程打下较好的基础。

    5289 人正在学习 去看看 武占文

简介

  在很多场景下,我们的程序需要完成窗体间的传值功能,有时候是父窗体→子窗体单向传值、子窗体→父窗体传值甚至是,也有时候我们需要父窗体⇆子窗体双向传值。
  在本文中主要介绍一些能够实现双向传值的方法,能够双向传值的方法也能够实现单向传值。
  本文的所有源码都可以在GitHub上下载
  
  本文介绍的方法仅限于我自己知道并且实现过的,我相信还有很多我并不知道的方法,因此也许在很多朋友眼中本文的内容是浅显甚至可笑的,希望路过的各方朋友不吝赐教,我也希望不断地进步!

方法1:Public字段+ShowDialog

原理

  这个方法的原理就是:
  1.父窗体在实例化子窗体对象(假定名为childWindow)的时候,通过对子窗体Public字段进行赋值的方法,完成父窗体→子窗体的传值;
  2.父窗体实例化子窗体后,调用子窗体的childWindow.ShowDialog()方法;
  3.随后在父窗体中对childWindow.DialogResult的值进行判断,当会话结束的时候,将childWindow的字段值传给父窗体,实现子窗体→父窗体的传值。

代码

  示例代码:
  父窗体为MainWindow,子窗体为ChildWindow,我们将两个窗体间Title字段值进行互传。逻辑代码我们都放在了窗体的按钮点击事件中,用按钮来触发。
  
  父窗体代码:

/// <summary>
/// 给子窗体传值
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_ShowChild_Click(object sender, RoutedEventArgs e)
{
    ChildWindow child = new ChildWindow() {  Title="我的名字是父窗体给的!" };//第1步,给子窗体传值了
    child.ShowDialog();//第2步,调用ShowDialog

    if (child.DialogResult==true)//第3步,然后对DialogResult进行判断
    {
        this.Title = child.Title;//子窗体给父窗体传值
    }
}

  子窗体代码  

/// <summary>
/// 给父窗体传值
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_ShowFather_Click(object sender, RoutedEventArgs e)
{
    this.Title = "我要给父窗体传值";
    this.DialogResult = true;//第3步,首先会话结束
}

效果截图

  截图为证:
  父窗体→子窗体
  点击“给子窗体传值”
  这里写图片描述
  子窗体→父窗体
  点击“给父窗体传值”
  这里写图片描述

总结

  优点:这种方法简单方便,可以实现子窗体和父窗体间互相传值;
  缺点:不够灵活,子窗体和父窗体都需要承载中间值的对象,而且需要借助ShowDialog()和DialogResult。

方法2:公共类的静态字段

原理

  这个方法的原理就是:父窗体和子窗体分别对同一公共类的静态字段(可以是同一个字段也可以是不同的字段)进行赋值,然后父窗体和子窗体各自获取这些字段的值,就能够实现窗体间的传值。
  该方法同样需要借助到ShowDialog()和DialogResult。

代码

  公共类代码  

/// <summary>
/// 公共类
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public class InfoClass
{
    public static string Title { get; set; }
    public static string Message { get; set; }
}

  父窗体代码 

/// <summary>
/// 实例化子窗体,为公用类静态字段赋值
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_ShowChild_Click(object sender, RoutedEventArgs e)
{
    InfoClass.Title = "我的名字来自公共类!";
    ChildWindow child = new ChildWindow();
    child.ShowDialog();

    if (child.DialogResult==true)
    {
        this.Title=InfoClass.Title;
        MessageBox.Show(InfoClass.Message);
    }
}

  子窗体代码 

/// <summary>
/// 加载事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Window_Loaded(object sender, RoutedEventArgs e)
{
    this.Title = InfoClass.Title;
}

/// <summary>
/// 修改公共类的静态字段,变相为父窗体赋值
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_ShowFather_Click(object sender, RoutedEventArgs e)
{
    InfoClass.Title = "我的名字也是来自公共类!";
    InfoClass.Message = "这是子窗体留下的信息!";
    this.DialogResult = true;
}

效果截图

  截图为证:
  父窗体→子窗体
  点击“给子窗体传值”
  这里写图片描述
  子窗体→父窗体
  点击“给父窗体传值”
  这里写图片描述
  

总结

方法3:构造函数+委托(我认为最好的方法)

原理

  这个方法的原理就是:
  1.父窗体利用子窗体的构造函数向子窗体传值;
  2.自定义子窗体的构造函数,函数签名包含一个委托函数;
  3.在子窗体中调用来自父窗体传递的委托函数,对对父窗体进行传值。

代码

  委托代码
  这个方法需要用到委托函数,我们将委托函数单独定义在公共类文件里面。
  代码如下:

public delegate void ShowMessage(string value);

  父窗体代码
  

/// <summary>
/// 通过自定义构造函数,给子窗体传值
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_ShowChild_Click(object sender, RoutedEventArgs e)
{
    ChildWindow child = new ChildWindow(ShowErrorMessage,"这是来自父窗体的信息");
    child.Show();
}

/// <summary>
/// 符合委托函数ShowMessage返回类型和签名的函数实例
/// </summary>
/// <param name="value"></param>
private void ShowErrorMessage(string value)
{
    MessageBox.Show(value,"父窗体提示框");
}

  子窗体代码

ShowMessage sm;
string value="";
public ChildWindow(ShowMessage _sm,string _value)
{
    InitializeComponent();
    sm = _sm;
    value = _value;
}

/// <summary>
/// 加载事件,显示父窗体传递来的值
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Window_Loaded(object sender, RoutedEventArgs e)
{
    MessageBox.Show(value, "子窗体提示框");
}


/// <summary>
/// 调用父窗体传来的委托函数,给父窗体传值
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_ShowFather_Click(object sender, RoutedEventArgs e)
{
    sm.Invoke("这是来自子窗体的信息!");
}

效果截图

  截图为证:
  
  父窗体→子窗体
  点击“给子窗体传值”
  这里写图片描述
  子窗体→父窗体
  点击“给父窗体传值”
  这里写图片描述
  

总结

  优点:能够在不关闭子窗体的情况下实现两个窗体间的传值(而且不仅限于传值),灵活方便,功能强大;
  缺点:需要对委托有一定的了解,使用起来需要对这个方法有一定的理解;

2017-04-16 21:07:22 C_xxy 阅读数 327
  • C#Winform窗体与界面设计

    本课程是针对C#Winform开发人员的基础性课程,详尽的介绍C#Winform窗体与界面的设计,通过提供实例,让C#Winform开发人员掌握相关程序设计技巧,为后面学习完整的实战课程打下较好的基础。

    5289 人正在学习 去看看 武占文

方法一:委托(事件)方法

(1)父窗体Form1代码:

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        //父窗体中的2个待传(传至子窗)字段
        public List<string> data1 = new List<string>() { "111", "222" };
        public List<string> data2 = new List<string>() { "333", "444" };
        //按照委托定义的方法
        private List<string> TransData1()
        {
            return this.data1;
        }
        private List<string> TransData2()
        {
            return this.data2;
        }
        private void button1_Click(object sender, EventArgs e)
        {
            Form2 frm2 = new Form2();
            //给子窗体的事件绑定实现方法
            //frm2.SendTo += TransData1; //直接绑定
            frm2.SendTo += delegate() { return data2; };  //匿名方法
            frm2.SendTo += () => data2; //lanmuda表达式(无参、有多参都要括号)
            frm2.Show(this);  //非模态对话框
        }
    }

(2)子窗体Form2代码:

public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }
        public delegate List<string> SomeDelegate();  //委托类型(无参、List<>类型)
        public event SomeDelegate SendTo;  //事件封装委托

        private void button1_Click(object sender, EventArgs e)
        {
            List<string> point=new List<string>();
            point.AddRange(SendTo());
            if (this.SendTo != null)
            {
                foreach (var i in point)
                {
                    MessageBox.Show(i);
                }
            }
        }
    }

方法二:公有属性/方法

(1)父窗体Form1代码:

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public List<double> text = new List<double>() { 11, 22, 33, 44, 55, 66 };//字段
        public List<double> TextTanspose //公有属性封装字段
        {
            get { return this.text; }
            set { this.text = value; }
        }
        private void button1_Click(object sender, EventArgs e)
        {
            Form2 frm2 = new Form2();
            frm2.Show(this); //非模态对话框
            //frm2.ShowDialog(this); 模态对话框
        }
    }

(2)子窗体Form2代码:

   public partial class Form2 : Form
    {

        public Form2()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Form1 frm1 = (Form1)this.Owner;
            List<double> data = frm1.TextTanspose; //使用属性get
            foreach(var ii in data )
            {
                MessageBox.Show(ii.ToString());
            }
        }
    }

希望以上讨论能对新学习的朋友有所帮助!

2016-10-27 14:12:57 u012391923 阅读数 10181
  • C#Winform窗体与界面设计

    本课程是针对C#Winform开发人员的基础性课程,详尽的介绍C#Winform窗体与界面的设计,通过提供实例,让C#Winform开发人员掌握相关程序设计技巧,为后面学习完整的实战课程打下较好的基础。

    5289 人正在学习 去看看 武占文

C#怎么设置子窗体在主窗体中居中显示
问题的开始是由C#传传看主群里的印醒提出来的,下面我来说一下解决方案吧


其实表面上看是很简单的
开始吧,现在有两个窗体Form1主窗体,Form2子窗体
而且我相信大部分人都会这样写
在子窗体的Load事件中
这样写:

this.StartPosition = FormStartPosition.CenterParent;

其实这样写是不对的,正确的写法应该是:

this.StartPosition = FormStartPosition.CenterScreen;

为什么是CenterScreen而不是CenterParent呢?
那是因为我们调用的方法的问题,如果你在调用子窗体时是这样写的话

Form2 f2 = new Form2();
f2.MdiParent  = this;
f2.Show();

那就得使用CenterScreen而不是CenterParent了,因为在Show的时候窗体是Owner页不是Parent
只要使用ShowDialog()方法时使用CenterParent才有效
大家会说这样就行了吗?其实也不行,我们的代码不应该写在Load事件中,而是在Show方法之前写。


正确的写法应该是这样的

Form2 f2 = new Form2();
            f2.MdiParent  = this;
            f2.StartPosition = FormStartPosition.CenterScreen;
            f2.Show();

在子窗体中你什么也不需要做

转载自:http://www.cnblogs.com/sufei/archive/2012/12/03/2799468.html

没有更多推荐了,返回首页