如何继承Windows窗体控件

时间:2015-03-15 09:37:35

标签: c# winforms inheritance datagridview

我有一个主要表单,包括datagridview,combobox,textboxes等控件。我创建了另一个我想用它作为选择的向导,因为我试图让它看起来像用户友好。现在我希望能够继承主窗体内的控件。我不上课也不创作,因为我不想使用它。我知道如何创建类并在我想要访问方法,属性和函数的表单中调用我的类。

如何从一种形式访问控件。

例如datagridview和textbox来自form1。在表单二,我希望能够访问这两个控件(datagridview和文本框)。请注意这里给出一个例子,但从我的主要形式我有两种控制。

我的代码来自向导表单

    private void btnBrosweInput_Click(object sender, EventArgs e)
    {
            BrowseFile();
            ReadFile(ref Gridview_Input, 
            ref txtInputfile, 
            ref cboLanguage, 
            bref btnNewfile);

      //Errors that m getting from this method
     1.Gridview_Input' does not exist in the current context
     2.The best overloaded method match for    .FrmExisitngFile.ReadFile(ref System.Windows.Forms.DataGridView, ref System.Windows.Forms.TextBox, ref System.Windows.Forms.ComboBox, ref System.Windows.Forms.Button)' has some invalid arguments
     3.Error    5   Argument 1: cannot convert from 'ref Gridview_Input' to 'ref System.Windows.Forms.DataGridView'


    }

我已将此方法用于表单上的readfile

       private void ReadFile(ref DataGridView _Grid, ref TextBox _InputTexBox, ref ComboBox _cboLanguage, ref  Button _btnNew)
    {
        _Grid.Rows.Clear();
        string PathSelection = ""; 
        if (_InputTexBox.Text.Length > 0)
        {
            PathSelection = _InputTexBox.Text;
        }
        oDataSet = new DataSet();          
        XmlReadMode omode = oDataSet.ReadXml(PathSelection);

        for (int i = 0; i < oDataSet.Tables[2].Rows.Count; i++) 
        {
            string comment = oDataSet.Tables["data"].Rows[i][2].ToString();
            string font = Between(comment, "[Font]", "[/Font]");
            string datestamp = Between(comment, "[DateStamp]", "[/DateStamp]");
            string commentVal = Between(comment, "[Comment]", "[/Comment]");

            string[] row = new string[] { oDataSet.Tables["data"].Rows[i][0].ToString(), oDataSet.Tables["data"].Rows[i][1].ToString(), font, datestamp, commentVal };
            _Grid.Rows.Add(row);
            _btnNew.Enabled = true;
        }
    }

从向导表单尝试从主窗体访问控件,其中包含将加载所有内容的网格

1 个答案:

答案 0 :(得分:0)

您的代码中发生了很多事情,但主要问题是您尝试操纵UI控件中的数据。这是一个非常糟糕的主意,它使您的设计大大复杂化(正如您已经从这个相当小的功能中看到的那样)。

正如我在OP的评论中所述,您不想操纵控件来处理数据。您想要操纵POCO(普通旧CLR对象)中的数据。然后更新(或更好:数据绑定)公开这些数据的所有控件。

所以你应该从做这样的事情开始:

public class Form2 : Form
{
  private List<Things> _listOfThings;
  private string _inputText;
  private LanguageEnum _lang;
  ...

  // Receives data, NOT controls! 
  public Form2(List<Things> listOfThings, string inputText, LanguageEnum lang, ...)
  {
    _listOfThings = listOfThings;
    ...
  }
  ...
}    

您的Form1通过listOfThingsDataGridView通过inputText反映了TextBox的状态,依此类推。你明白了。 Form1通过构造函数注入将这些数据(不是控件)传递给Form2

Form2 form2 = new Form2(listOfThings, inputTextBox.Text, ...);
form2.ShowDialog();

您使用Form2类中的私有字段读取和更新数据。关闭Form2后,您可以明确地或使用Databinding更新Form1的控件。