在C#中怎么样在一个文本框调用另一个窗口的文本框

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在C#中怎么样在一个文本框调用另一个窗口的文本框相关的知识,希望对你有一定的参考价值。

你可以不要把这个问题想的太难,其实上这个问题就是窗体间的控件的相互调用。问题的实质在于这两个关联的窗体也是类,既然是类,我们可以用类的观点去解决这个问题。很好解决。

比如你的窗体A中有
textBox1
窗体B中有textBox2
,现在您
要在A中访问B中的textBox2,可以这么做:

1:把B中的textBox2的属性设置成Public
,(如果想静态调用可以加public
static
最好,如果不加
就在A调用B的时候在构造函数中传递参数)

2:在A中设置一个a_textBox2变量,接受来自B的textBox2里面的值,然后赋值给A中的a_textBox2
这样在A中就可以访问B中的变量了。

很简单的,仔细研究下,主要是把他们当成类理解。
参考技术A 在构造函数里面吧你的那个文本框传到另一个窗口就好了

例如:

Form2
调用Form1
窗体中的TextBox1

Form2中构造函数

TextBox
t
;

void
Form2(TextBox
t1)



This.t=t1;



//在Form2中随便调用
t.Text

就是Form1中中TextBox1的值

//Form1中实例化窗体Form2

Form2
f=new
Form2(
TextBox1
)

//
TextBox1

为Form窗体中需要调用的文本框
这样你在Form2中就可以调用TextBox1的值了

f.show();
参考技术B 很简单,首先,把被调用控件可见性设为public,然后创建窗口是时保存窗口对象,然后,直接使用就行。本回答被提问者采纳

从另一个类文件访问 C# Form 文本框

【中文标题】从另一个类文件访问 C# Form 文本框【英文标题】:Accesing C# Form textbox from another class file 【发布时间】:2012-09-07 20:57:16 【问题描述】:

我想从另一个类文件(例如chartscopier.cs)访问Form1 元素,但我无法从chartcopier.cs 更改textbox1 文本。

我该怎么做?

这是我的代码:

Form1.cs

namespace TEST

    public partial class Form1 : Form
    
        public Form1()
        
            InitializeComponent();
            var CopyCharts = new System.Threading.Timer(chartscopier.CopyGraph, null, 0, 60000);
        
    

chartscopier.cs

namespace TEST

    class chartscopier
    
        //var Timer = new Timer(CopyGraph, null, 0, 60000);
        public static void CopyGraph(object data)
        
            Stopwatch strTimer = new Stopwatch();
            WebClient WC = new WebClient();
            IConfigSource BaseConfig = new IniConfigSource(@"D:\NEWROBOT\CONFIG.ini");
            string LogDir = BaseConfig.Configs["GENERAL"].Get("Log Dir");
            string ImgDir = BaseConfig.Configs["GENERAL"].Get("IMG Dir");
            string[] Clients = BaseConfig.Configs["CLIENTS"].GetKeys();
            foreach (string Client in Clients)
            
                strTimer.Start();
                //Console.WriteLine(Client);
                IConfigSource ClientConfig = new IniConfigSource(@"D:\NEWROBOT\" + Client + ".ini");
                string[] Services = ClientConfig.Configs["SERVICES"].GetKeys();
                foreach (string Service in Services)
                
                    string url = BaseConfig.Configs["CLIENTS"].Get(Client);
                    string param = ClientConfig.Configs["SERVICES"].Get(Service);
                    string html = WC.DownloadString(url + param);

                    // Cargar doc en HPACK
                    HtmlDocument doc = new HtmlDocument();
                    doc.LoadHtml(html);

                    // LINQ para generar imagenes
                    var img = doc.DocumentNode.SelectSingleNode("//img[1]");
                    var src = img.Attributes["src"].Value;
                    string uIMG = url + src;
                    WC.DownloadFile(uIMG, @ImgDir + Client + "\\" + Service + ".png");
                
                strTimer.Stop();
                TimeSpan ts = strTimer.Elapsed;
                string elapsedTime = String.Format("0:00:1:00:2:00.3:00", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds / 10);
                strTimer.Reset();
                // WANT TO WRITE HERE Form1.TextBox1.text = "RunTime " + elapsedTime;
            
        
    

【问题讨论】:

【参考方案1】:

我认为,更好的方法是通过事件来处理。

创建一个类来表示您要传递的数据。

public class ChartCopyProgressEventArgs : EventArgs

  public TimeSpan ElapsedTime  get; set; 
  //you can add more prop.s here

在“chartscopier”中创建一个事件来报告进度。

class chartscopier

 public static event EventHandler<ChartCopyProgressEventArgs> Changed;
 public static void CopyGraph(object data)
 
 ...
 if (Changed != null)
 
   var args = new ChartCopyProgressEventArgs();
   args.ElapsedTime = elapsedTime;
   Changed(null, args);
 
 

然后在 Form1 中,为该事件创建一个处理程序。

public Form1()

 InitializeComponent();
 chartscopier.Changed += UpdateStatus;
 ...


private void UpdateStatus(object sender, ChartCopyProgressEventArgs e)
 
    var ts = e.ElapsedTime;
    var elapsedTime = String.Format("0:00:1:00:2:00.3:00", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds / 10);
    var str = "RunTime " + elapsedTime;

    if (TextBox1.InvokeRequired) 
        TextBox1.Invoke(() => TextBox1.text = str;);
     else 
         TextBox1.text = str;
    

【讨论】:

不错的解决方案。请注意,如果event 的类型是Action&lt;TimeSpan&gt;,它将显着减少代码膨胀。 调用if(Changed != null)时会报错非静态字段、方法或属性“成员”需要对象引用:S 啊..静态的..对不起。请现在检查。还修复了事件引发代码。 谢谢!!这行得通,但我需要将这个 TextBox1.Invoke(() =&gt; TextBox1.text = str;); 修复到这个 TextBox1.Invoke((MethodInvoker)delegate TextBox1.Text = str; ); 以及 text for Text (大写)【参考方案2】:

您需要将表单传递给该函数,以便您可以访问它,然后在表单上编写一个公共函数来修改/获取文本框。确保这两个函数正在检查是否需要调用。

【讨论】:

【参考方案3】:

您需要将您希望chartscopier.CopyGraph 直接操作的引用传递给该方法,以便它可以在范围内。你的CopyGraph(object data) 签名应该更像CopyGraph(object data, TextBox aTextBox)

然后您可以从 Form1 的实例中调用它,例如

chartscopier.CopyGraph(data,this.textBox1)

【讨论】:

【参考方案4】:

这个例子将向你展示如何从其他类访问表单元素:

public partial class Form1 : Form
           
        private void button1_Click(object sender, EventArgs e)
        
            FormCopier fc = new FormCopier();
            fc.PopulateTest(this.textBox1);
        
      

在其他班级..

class FormCopier

    public void PopulateTest(TextBox t)
    
        t.Text = "Demo";
        t.Refresh();
    

【讨论】:

以上是关于在C#中怎么样在一个文本框调用另一个窗口的文本框的主要内容,如果未能解决你的问题,请参考以下文章

C#中怎样从一个form的文本框获取另一个form中Comobox控件的值

在 Windows 中,如何使用 C++ 或 C# 在属于另一个进程的窗口中突出显示文本?

如何将文本框中的字符串添加到另一个窗口中的列表视图

C#如何从表单中的文本框中获取文本,从不同的类调用

C#:在窗体中放了多个文本框,我想要在里面输入数字,但要规定它不能超出范围,若超出范围,那就要提示

C#中在文本框中输入的字符串怎么让它隐藏