我有一个主要表单,包括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;
}
}
从向导表单尝试从主窗体访问控件,其中包含将加载所有内容的网格
答案 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
通过listOfThings
,DataGridView
通过inputText
反映了TextBox
的状态,依此类推。你明白了。 Form1
通过构造函数注入将这些数据(不是控件)传递给Form2
:
Form2 form2 = new Form2(listOfThings, inputTextBox.Text, ...);
form2.ShowDialog();
您使用Form2
类中的私有字段读取和更新数据。关闭Form2
后,您可以明确地或使用Databinding更新Form1
的控件。