2

还是 C# .NET 的新手,所以首选如此简单(带有解释)。:) 我有一个带有几个文本框的 Windows 表单。我希望能够在单独的文件中读取这些文本框的内容。 我已经看过涵盖类似问题的文章(也在 stackoverflow 上),但在我的情况下不起作用。我想要的数据可以在 Form1 的文本框中找到。我希望这些数据去的地方是-> myOtherCS,它将在一个方法(Savedoc)中使用。

在 Form1.cs 我有:

private myOtherCS allOtherMethods;
public static string myText= "";
public static string mytitle = "";

public Form1()
{
    InitializeComponent();            
    allOtherMethods = new myOtherCS();
}
/* I would like the myText to be filled with the contents of Textbox1
 *  and mytitle to be filled with contents of Textbox2. Ideally when the
 * Textboxes have been changed.  */

private void TextBox1_TextChanged(object sender, EventArgs e)
{
     myText = Textbox1.Text;
}

private void TextBox2_TextChanged(object sender, EventArgs e)
{
     myTitle = Textbox2.Text;
}

在 myOtherCS 文件中,我希望能够在不同的方法中使用这些值。所以首先可能“获取”和“设置”它们。我已经尝试了很多东西,但这里有一个......从......我知道你必须改变两个文件中的东西,并且有,但这是为了得到这个想法。

public class GetTextBoxes
{
    private string title;
    private string text;

    public string Title
    {
        get { return title; }
        set { title = value; }
    }

    public string Text
    {
        get { return text; }
        set { text = value; }
    }
}

public void SaveDoc()
{ 
    GetTextBoxes.title;
    GetTextBoxes.text;
}

到目前为止,这是 PSEUDOcode,试图展示我想要做什么。我已经尝试了很多东西,如果有人知道如何做到这一点,我将非常感激!提前致谢

4

6 回答 6

1

如果您将字符串存储为公开,那么您所要做的就是说......

Form1 form=new Form1();
Console.out.write(form.myText);

如果您的字符串是公开的,则无需使用 getter 和 setter。虽然我可能会将它们保持为静态。这些方法将在每次更改后更新,因此不需要额外的方法。您还可以将您的标题对象设置为公共它们是类型,这样您对字符串所做的操作就可以再次实现,但使用您的表单的一部分。

public System.Windows.Forms.Button button1;
于 2012-12-05T14:36:10.367 回答
1

我认为最好的方法是你所做的。拥有一个公共类来获取和设置值并在不同的 Windows 窗体之间共享它们是我自己一直使用的想法。您也可以通过表单构造函数传递您的值,但那是您只想在表单初始化时获取值的时候!所以在你的情况下,我认为这不是一个好主意。. . 祝你好运

于 2012-12-05T14:40:56.493 回答
1

你可能想改变你的思维方式,这里有一些想法:

  • 更多地从数据模型的角度考虑它。您的 Form1 试图在概念上表示什么?在此基础上创建您的数据模型来支持该需求。通过数据模型,我的意思是一个简单的类,如您在问题中定义的那样,您可以调用您的类 Document.getter/setter。

    公共类文档 { 公共字符串标题 {get;set;} 公共字符串文本 {get;set; }

    因此,不要在 Form1 中使用静态字段:

    公共静态字符串 myText=""; 公共静态字符串 mytitle = "";

    您可以定义一个公共属性public Document MyDocument {get;set;} 并在构造函数中对其进行初始化。

  • 然后您可以使用数据绑定,以便您可以将模型(文档)绑定到 Form1 中的控件。

  • 想想您在 Form1 和 myOtherCS 之间的交互。您如何设想用户的工作流程?填写Form1然后执行一个动作?转到另一种形式,等等?myOtherCS 只是一个将处理 Form1 数据的服务吗?

我不想帮助您解决特定的技术问题,而是想拓宽您的视野并确定您真正想做的事情,然后找到最合适的技术解决方案来满足该要求。相信我,我已经在 WinForms 上苦苦挣扎了很长时间,但更重要的是明确你想在高层次上完成什么。

于 2012-12-05T14:49:48.580 回答
0

您需要在 textchanged 事件处理程序中设置 allOtherMethods 的属性。

这是代码:

private void TextBox1_TextChanged(object sender, EventArgs e)
{
   allOtherMethods.Text = Textbox1.Text;
}
private void TextBox2_TextChanged(object sender, EventArgs e)
{
   allOtherMethods.Title= Textbox2.Text;
}

和代码

public void saveText()
{ 
       GetTextBoxes.title;
       GetTextBoxes.text;
}

是没有意义的。您不能在类之外声明方法。

c# 是一种 OOP 语言。所以这里的常见概念是您应该始终尝试在事件处理程序中设置属性或调用实例的方法。

于 2012-12-05T14:35:38.307 回答
0

假设每个主窗体和另一个窗体都包含一个文本框。您可以做的是打开另一个表单Show(),将主表单作为参数传递。然后,您可以为文本更改添加事件处理程序。TextBox当主窗体的TextBox文本更改时,下面的示例将更新您在另一个窗体上的内容。这是您的主要形式:

public partial class Form1 : Form
{
    OtherForm otherForm;
    public Form1()
    {
        InitializeComponent();
        otherForm = new OtherForm();
        otherForm.Show(this);
        textBox1.TextChanged += textBox1_TextChanged;
    }

    void textBox1_TextChanged(object sender, EventArgs e)
    {
        otherForm.textBox1.Text = textBox1.Text;
    }
}

OtherForm设计器中,设置textBox1 ModifiersPublic,如下图

在此处输入图像描述

[编辑]

这是基于Servy建议的更好方法。

public partial class Form1 : Form
{
    OtherForm otherForm;
    public Form1()
    {
        InitializeComponent();
        otherForm = new OtherForm();
        otherForm.Show(this);
    }
}

//...

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

    string SomeMethod()
    {
        var parent = (Form1)this.Owner;
        return parent.textBox1.Text;
    }

    private void textBox1_MouseClick(object sender, MouseEventArgs e)
    {
        textBox1.Text = SomeMethod();
    }
}
于 2012-12-05T14:50:07.997 回答
0

您已经说过,当您单击按钮时,您的表单正在调用另一个类中的方法,而这些其他方法在执行计算时需要使用您的文本框的当前值。处理这个问题的正确方法是让那些其他方法接受两个字符串参数,并Text在调用这些方法时传递文本框的值。

这样做将允许您删除文本更改的处理程序和公共静态字段。它将确保信息不会暴露给所有东西,而实际上只有这两个类需要访问它,并且它将使您的程序更易于维护。

于 2012-12-05T14:55:32.623 回答