【问题标题】:Carrying user inputs from a textbox from one form to another将文本框中的用户输入从一种形式传送到另一种形式
【发布时间】:2017-07-09 15:23:15
【问题描述】:

我正在制作一个程序,用户可以在一个表单的文本框中输入值,然后数据将转移到另一个表单。我认为最好的方法是将用户数据存储在几个数组中,然后将这些数组传递过来,但目前我在做这件事时遇到了真正的麻烦。一旦用户输入了他们需要多少个文本框,也会创建文本框,因此最初页面上不存在文本框

 string q = combobox1.SelectedItem.ToString();
        int g = Convert.ToInt32(q);
        MessageBox.Show("I have added " +(g-1) +" Films to the list");
        TextBox[] FilmTitle1 = new TextBox[int.Parse(q)];
        TextBox[] FilmBudget1 = new TextBox[int.Parse(q)];
        TextBox[] FilmBoxOffice1 = new TextBox[int.Parse(q)];
        TextBox[] FilmDirector1 = new TextBox[int.Parse(q)];
        TextBox[] FilmRtScore1 = new TextBox[int.Parse(q)];
        TextBox[] FilmGenre1 = new TextBox[int.Parse(q)];
        int y = 500;
        for (int i = 0; i < g; i++)
        {
            FilmTitle1[i] = new TextBox();
            FilmTitle1[i].Text = "Film Title";
            FilmTitle1[i].Size = new Size(162, 20);
            FilmTitle1[i].Location = new Point(106, y);
            FilmTitle1[i].Tag = 0;
            this.Controls.Add(FilmTitle1[i]);
            y= y + 40;

private void Createbar_Click(object sender, EventArgs e)
    {
        BarGraphCreation frm = new BarGraphCreation(FilmTitle.Text, FilmBudget.Text, FilmBoxOffice.Text, FilmDirector.Text, FilmGenre.Text, ft1, FilmBudget1.Text, FilmBoxOffice1.Text, FilmDirector1.Text, FilmGenre1.Text);
       frm.Show();
    }

但是当我这样做时,它表示没有文本框的构造,尽管它允许它在程序中的其他任何地方使用。 非常感谢任何类型的帮助

【问题讨论】:

  • 请输入FilmTitle定义和BarGraphCreation()构造函数所在的行。
  • @Tatranskymedved 它已经在那里了。第 4 行代码向下。
  • @BugFinder:我只能看到构造函数的调用,但看不到它的定义。并且找不到FilmTitle(我只能看到FilmTitle1)。
  • TextBox 是一个普通的windows控件——你不会得到文本框的构造函数。
  • 所以FilmTitleTextBoxTextBox[]string

标签: c# arrays forms user-interface


【解决方案1】:
public class Form
{
        // your code ...

        string q = combobox1.SelectedItem.ToString();
        int g = Convert.ToInt32(q);
        MessageBox.Show("I have added " +(g-1) +" Films to the list");
        public TextBox[] FilmTitle1 = new TextBox[int.Parse(q)];
        public TextBox[] FilmBudget1 = new TextBox[int.Parse(q)];
        public TextBox[] FilmBoxOffice1 = new TextBox[int.Parse(q)];
        public TextBox[] FilmDirector1 = new TextBox[int.Parse(q)];
        public TextBox[] FilmRtScore1 = new TextBox[int.Parse(q)];
        public TextBox[] FilmGenre1 = new TextBox[int.Parse(q)];
        int y = 500;
        for (int i = 0; i < g; i++)
        {
            FilmTitle1[i] = new TextBox();
            FilmTitle1[i].Text = "Film Title";
            FilmTitle1[i].Size = new Size(162, 20);
            FilmTitle1[i].Location = new Point(106, y);
            FilmTitle1[i].Tag = 0;
            this.Controls.Add(FilmTitle1[i]);
            y= y + 40;

    private void Createbar_Click(object sender, EventArgs e)
    {
        BarGraphCreation frm = new BarGraphCreation(this);
       frm.Show();
    }
}

public class BarGraphCreation
{
    // your code...

    Form form;
    public BarGraphCreation(Form form)
    {
        // ...
        this.form = form;
    }

    private void function()
    {
        // here you can work with your data like
        // form.FilmTitle1 and so on
    }
}

【讨论】:

    【解决方案2】:

    您应该避免将像TextBox 这样的整个对象传递给其他一些控件。一般的想法是你永远不要只传递数据(信息)。

    由于Form 布局是动态创建的,因此Controls 的相关信息应保存在某个位置,以便再次轻松访问。

    示例(包括数组和列表为例):

    public class Form1 : Form
    {
        private TextBox[] FilmTitles;
        private List<TextBox> FilmBudget = new List<Textbox>();
    
        //code removed for brevity
    
        private void Button1_Click( /***/ )
        {
            FilmBudget.Clear();
    
            int count = Convert.ToInt32(q);
            FilmTitles = new TextBox[count];
    
            for (int i = 0; i < count; i++)
            {
                FilmTitles[i] = new TextBox()
                {
                    Text = "Programmer in one day",
                    Size = new Size(162, 20)
                    // all other definitions
                };
    
    
                FilmBudget.Add(new TextBox()
                {
                    Text = "1225",
                    Size = new Size(162, 20)
                    // all other definitions
                };
    
                this.Controls.Add(FilmTitles[i]);
                this.Controls.Add(FilmBudget[i]);
    
                //Now you are holding all the TB & text in global variables (arrays/lists)
            }
        }    
    
        private void Createbar_Click(object sender, EventArgs e)
        {
    
            BarGraphCreation frm = new BarGraphCreation(
                   FilmTitles.Select( a => a.Text).ToArray(),
                   FilmBudget.Select( a => a.Text).ToArray());
            frm.Show();
        }    
    
    }
    

    地点:

    public class BarGraphCreation : Form
    {
        public BarGraphCreation(string[] Titles, string[] Budgets)
        { }
    }
    

    请注意,这部分是使用LINQ 将确切的属性(值)选择到 2 个数组中:

    BarGraphCreation frm = new BarGraphCreation(
                   FilmTitles.Select( a => a.Text).ToArray(),
                   FilmBudget.Select( a => a.Text).ToArray());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-23
      • 1970-01-01
      • 2015-06-06
      • 1970-01-01
      相关资源
      最近更新 更多