关于变量在不同的form中间的传递
意图是将form2中的a的值传到form1中??代码如何编写啊!!跪求!!!如何定义如何编写啊!!!
--------------------编程问答-------------------- 方法1. 定义全局变量
方法2. 在form2中定义一个属性为public 对外公开,只可读取,不可写 --------------------编程问答-------------------- 全局变量。定义成窗体属性public类型。
如果需要频繁窗体间传来传去,那就全局吧。 --------------------编程问答-------------------- --------------------编程问答-------------------- form2和form1是什么关系呢? --------------------编程问答-------------------- form1中的一些属性的改变通过form2中的一个变量的值的改变来改变。。。。我的意思是比方form2中有一个a变量。。。当form2做了某个动作后a取值为1.然后form1中的一些空间就隐藏起来。。。 --------------------编程问答-------------------- 是有点困难,以前遇到过类似的事情。不过,不建议全局变量,滥用全局变量这种概念,不是个好的编程习惯。你的参数需要动态的传递,需要使用事件,form2触发,在form1中响应事件的方法中写代码获取form2的变量值,然后动作。 --------------------编程问答-------------------- 抽象是什么?
类是什么?
--------------------编程问答--------------------
再提醒一遍,先说清楚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;可以显示。。。只是起到一个类似开关的作用。。。。
由于是刚入门。。。所有很多东西比较薄弱。。。虚心求指导!!! --------------------编程问答--------------------
我的意图是让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#