在c#中以编程方式获取控件名称

时间:2012-11-15 23:55:58

标签: c# winforms

我对c#.net相对较新。如果您想要更多输入来回答我的问题,请告诉我。

1)我想做什么?

我使用的表单在3个不同的标签中有近30个数据网格视图控件。 datagridview的名称如下。 dgView1dgView2dgView3

除了上面的数据网格控件,我也有很少的文本框控件,所以在选项卡1中更具体..我得到了控制项目。 txtTabName1txtStrKey1dgView1

现在我正在尝试编写一个函数,它将输入一个输入参数int v_CtrlNum 并且使用此参数我需要从一个选项卡中扫描每个项目并将其添加到ArrayList / Collection。

所以例如函数将需要从datagrid视图中读取每一行,如下所示

for datagrid

foreach (DataGridViewRow in dgView+v_CtrlNum )

for textbox

txtTabName+v_CtrlNum

我想知道我是否采取了正确的方向。

3 个答案:

答案 0 :(得分:2)

您可以查看Controls.Find Method,请注意它会返回匹配的控件数组。

Control[] tbp = tabControl1.Controls.Find("txtTabName" + 2,true );
if (tbp.Length > 0)
{
    Control[] dv = tbp[0].Controls.Find("dgView" + 2, true);
}

答案 1 :(得分:0)

我不完全确定我正在追踪你想要实现的目标,但我认为你只想通过身份证号码来控制,对吧? 你可以这样做:

List<Controls> myTabControls = new List<Controls>();
foreach (Control thisControl in this.Controls)
    if (thisControl.Name.Contains(v_CtrlNum.ToString()))
        foreach (Control thisChildControl in thisControl.Controls)
            myTabControl.Add(thisChildControl)thisChildControl

要获取与v_CtrlNum对应的选项卡中的控件,假设v_CtrlNum是控件名称的一部分的标识符。然后通过选项卡中的控件来处理每个DataGridView,可能是这样的:

foreach (Control thisControl in myTabContols)
    if (thisControl.GetType() == typeof(DataGridView))
       // Parse your DataGridView's rows here

this.Controls是表单的控件集合(this在这种情况下引用您的父表单。)

这有帮助吗?但我不确定我是否正确地理解了你在问题中提出的要求......

答案 2 :(得分:0)

我认为您可能想要做的是这样的事情:

DataGridView[] formDataGrids = this.Controls.OfType<DataGridView>().ToArray();

这将为您提供表单中所有DataGridView的数组。您可以使用该选项卡的控件列表为单个选项卡执行此操作。您可以对文本框执行相同的操作,只需使用TextBox替换OfType()调用中的数组类型和类型。

您不能像示例中那样使用foreach,因为“in”的右侧必须是对特定List或Array的引用(实现IEnumerable的内容)。但是如果您创建了上面的列表,那么您可以执行以下操作:

foreach(DataGridView thisGrid in formDataGrids)
    DoSomething(thisGrid);

或者将它们链接在一起,如:

foreach(DataGridView thisGrid in this.Controls.OfType<DataGridView>())
    DoSomething(thisGrid);

对于多标签处理,您应该已经在设计器中为每个页面创建了TabPage成员。然后你可以做类似的事情:

var formDataGrids = new List<DataGridView>();
if (usingTab1)
    formDataGrids.AddRange(tabPage1.Controls.OfType<DataGridView>());
if (usingTab2)
    formDataGrids.AddRange(tabPage2.Controls.OfType<DataGridView>());
if (usingTab3)
    formDataGrids.AddRange(tabPage3.Controls.OfType<DataGridView>());

foreach(var thisGrid in formDataGrids)
    DoSomething(thisGrid);