当前位置:编程学习 > C#/ASP.NET >>

关于变量在不同的form中间的传递

意图是将form2中的a的值传到form1中??
代码如何编写啊!!跪求!!!如何定义如何编写啊!!!
--------------------编程问答-------------------- 方法1. 定义全局变量
方法2. 在form2中定义一个属性为public 对外公开,只可读取,不可写 --------------------编程问答-------------------- 全局变量。定义成窗体属性public类型。
如果需要频繁窗体间传来传去,那就全局吧。 --------------------编程问答-------------------- --------------------编程问答-------------------- form2和form1是什么关系呢? --------------------编程问答-------------------- form1中的一些属性的改变通过form2中的一个变量的值的改变来改变。。。。我的意思是比方form2中有一个a变量。。。当form2做了某个动作后a取值为1.然后form1中的一些空间就隐藏起来。。。 --------------------编程问答-------------------- 是有点困难,以前遇到过类似的事情。不过,不建议全局变量,滥用全局变量这种概念,不是个好的编程习惯。你的参数需要动态的传递,需要使用事件,form2触发,在form1中响应事件的方法中写代码获取form2的变量值,然后动作。 --------------------编程问答-------------------- 抽象是什么?
类是什么?
--------------------编程问答--------------------
引用 5 楼 u012694489 的回复:
form1中的一些属性的改变通过form2中的一个变量的值的改变来改变。。。。我的意思是比方form2中有一个a变量。。。当form2做了某个动作后a取值为1.然后form1中的一些空间就隐藏起来。。。


再提醒一遍,先说清楚form1跟form2的生存和依赖关系。 --------------------编程问答--------------------
引用 8 楼 sp1234 的回复:
Quote: 引用 5 楼 u012694489 的回复:

form1中的一些属性的改变通过form2中的一个变量的值的改变来改变。。。。我的意思是比方form2中有一个a变量。。。当form2做了某个动作后a取值为1.然后form1中的一些空间就隐藏起来。。。


再提醒一遍,先说清楚form1跟form2的生存和依赖关系。

呵呵,老大考虑问题总是比较周密的 --------------------编程问答-------------------- using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;



namespace WindowsFormsApplication1

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

        #region 定义全局变量及对象
        string strCon = "Data Source=MJQ;Database=db_09;Uid=sa;Pwd=123456;";
        SqlConnection sqlcon;
        SqlDataAdapter sqlda;
        DataSet myds;
        
        #endregion

        
      

        private void 用户登陆(object sender, EventArgs e)
        {
            Form2 frm = new Form2(); 
            frm.Show();
        }
        private void 联系方式(object sender, EventArgs e)
        {
            MessageBox.Show("计量大厅电话:5240");
        }

        private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {

        }

       

        private void button2_Click(object sender, EventArgs e)
        {
          
                
        }

        private void button3_Click(object sender, EventArgs e)
        {
            sqlcon = new SqlConnection(strCon);
            sqlda = new SqlDataAdapter("select * from 档案信息", sqlcon);
            myds = new DataSet();
            sqlda.Fill(myds, "档案信息");
            var query = from salary in myds.Tables["档案信息"].AsEnumerable()
                        select salary;
            DataTable myDTable = query.CopyToDataTable<DataRow>();
            if ( a == 1)
            {
                dataGridView1.DataSource = myDTable;
            }  
        
    }
    
       
    }
    
    
}
--------------------编程问答-------------------- using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
    public partial class Form2 : Form
    {
        public int a;
       
     
        public Form2()
        {
            InitializeComponent();
        }

        private void label1_Click(object sender, EventArgs e)
        {
            
        }

        public void button1_Click(object sender, EventArgs e)
        {
           
            if (textBox1.Text=="cc"&&textBox2.Text=="123456")
            {
                this.DialogResult = DialogResult.OK;
                this.Close();
                MessageBox.Show("登陆成功");
                a = 1;
                
            }
            
            else
            { MessageBox.Show("用户名或密码错误");
            
            }
        }

        private void Form2_Load(object sender, EventArgs e)
        {

        }
    }

        


}
--------------------编程问答-------------------- 我的意图是让form2在登陆成功后把a赋值为1.然后将a的值返回form1,使dataGridView1.DataSource = myDTable;可以显示。。。只是起到一个类似开关的作用。。。。
  由于是刚入门。。。所有很多东西比较薄弱。。。虚心求指导!!! --------------------编程问答--------------------
引用 12 楼 u012694489 的回复:
我的意图是让form2在登陆成功后把a赋值为1.然后将a的值返回form1,使dataGridView1.DataSource = myDTable;可以显示。。。只是起到一个类似开关的作用。。。。
  由于是刚入门。。。所有很多东西比较薄弱。。。虚心求指导!!!


根据你#11楼贴出的代码,那么Form2就是一个独立的组件,它不依赖于客户(使用它的)程序。

凡是独立的对象,它要通知自己的客户调用者一些事情,使用event机制。

而你的代码的逻辑很明显,你的Form2对象执行了 this.Close。这个时候父类 Form 已经定义了 Closed 事件,因此Form2对象实例也继承了这个事件。不需要你自己再另行编写event代码。



实际上你只说明了一半,你说明了“form2是独立的窗体”,而没有说明form1是否对form2产生依赖。

比如说你的form2拥有form1,那么可能是这样
public class Form1: Form
{
    ......

    private Form2 form2; 

    private void Form1_Load(object sender, EventArgs e)
    {
        form2= new Form2();
        form2.Closed += form2_Closed;
        form2.ShowDiaplog();
    }

    private void form2_Closed(object sender, EventArgs e)
    {
        int a = form2.a;
        ...........创建你的myTable
        dataGridView1.DataSource = myDTable;
    }
}


这样,form2关闭之后,form1会自动刷新 datagridview 内容。



软件开发,关键地是搞懂“事件驱动”的流程。不要仅仅谈论静态的对象结构,要重点搞懂事件驱动的先后时序设计。

静态结构的依赖关系与时许设计也是有关的。例如你的form2如果并不拥有form1,而是另外一个窗体(例如叫做MainForm)首先创建form2,然后等form2关闭(也就是捕获到closed事件)之后、才创建form1、并读取form2的字段a并赋值给form1的某个方法(这个方法接受int参数并且“创建你的myTable”),那就是另外的一个时序流程。

因此软件设计,不是随便扔出两个静态概念然后就“求代码”,而是要基于动态流程来设计。许多人之所以设计不了软件,就是因为满脑子只被静态概念塞满了,无法直观地具有想象力地去想“时序流程”图形。 --------------------编程问答-------------------- 比如说你的form2拥有form1  -->  比如说你的form1拥有form2


不了解“事件驱动”的设计概念,那么你学习最基本的程序设计入门,就只学会了三分之一。

准确地知道什么时候该捕获什么事件,甚至自己写下event语句来设计自己的事件通知,这是很重要的基础知识。 --------------------编程问答-------------------- 动动脑。。。。。。。。。。。。。。。 --------------------编程问答-------------------- 在你的程序设计中,你需要的流程是“用户登录”时产生的frm窗口抛出Closed事件时去查询和显示数据,而不是在什么button3按钮按下的时候。

有了事件驱动的知识,你就会更加恰当地表达业务逻辑。而不是搞什么“button3”了。 --------------------编程问答-------------------- 实际上如果说“随便编程设计”,你可以把Form1实例作为参数传递给Form2实例。例如
    private void Form1_Load(object sender, EventArgs e)
    {
        form2= new Form2();
        form2.form1 = this;
        form2.ShowDiaplog();
    }


然后在Form2中写类似于

         public Form1 form1;

         public void button1_Click(object sender, EventArgs e)
         {
            
             if (textBox1.Text=="cc"&&textBox2.Text=="123456")
             {
                 this.DialogResult = DialogResult.OK;
                 this.Close();
                 MessageBox.Show("登陆成功");
                 a = 1;
                 form1.读取数据库显示列表(a);
             }
            ......


也就是说“form2直接调用form1的方法”。不过这在设计上其实是由一些“忌讳”的。


事件的概念,它体现了依赖倒置的思想。我们可以把form2作为一个通用的窗体,它可以用在任何应用中,而并不依赖于Form1的定义。它只是通知自己的宿主,因此它是一个通用服务。

这是设计上常用的做法,避免写下相互循环依赖的概念(因为那很容易恶心循环成为一团面条)。如果Form1依赖于Form2,那么我们就让Form2成为服务而Form1成为客户。反之也是这样。 --------------------编程问答-------------------- 在每个form里创建一个方法,在new这个form的时候调用这个方法就能实现不同form之间的传递数据 --------------------编程问答-------------------- 传递数据怎么样 --------------------编程问答-------------------- 把a这个变量设定成public  --------------------编程问答-------------------- public 足可以实现。。 --------------------编程问答-------------------- 委托!!!!!!!!!!!
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,