Как найти вложенные элементы управления внутри вложенных пользовательских элементов управления - PullRequest
0 голосов
/ 12 июля 2011

У меня есть пользовательский элемент управления (Control1), который имеет заполнитель, который может содержать несколько дополнительных пользовательских элементов управления (того же типа - см. Ниже), которые добавляются динамически.Как перемещаться по иерархии пользовательских элементов управления, чтобы найти значения вложенных наборов элементов управления при нажатии кнопки, расположенной в элементе управления 1?

Элемент управления 1:

<%@ Control Language="C#" AutoEventWireup="True" CodeBehind="Control1.ascx.cs" Inherits="Control1" %>
<%@ Reference Control="Control2.ascx" %>

<div id="div1">
    <div id="divPh"><asp:PlaceHolder ID="phControls" runat="server" /></div>
<div id="divContinue"><asp:Button ID="btnContinue" Text="Continue" OnClick="submit_Click" runat="server" /></div>
</div>

Код для элемента управления1.aspx:

protected void submit_Click(object sender, EventArgs e)
{
  // iterate through list of divControl2 controls and find out which radio button is selected
  // for example, there may be 3 divControl2's which are added to the placeHolder on Control1, rdoBth1 might be selected on 2 of the controls
  // and rdoBtn2 might be selected on 1 - how do I navigate this control structure?
}

Control 2 (некоторые из них могут быть добавлены в placeHolder на Control1):

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="Control2.ascx.cs"     Inherits="Control2" %>
  <div id="divControl2">
      <p><strong><asp:RadioButton ID="rdoBtn1" GroupName="Group1" Checked="true" runat="server" /> Check this</strong></p>
      <p><strong><asp:RadioButton ID="rdoBtn2" GroupName="Group1" Checked="false" runat="server" /> No, check this one</strong></p>
  </div>

Ответы [ 2 ]

0 голосов
/ 12 июля 2011

Проверьте ниже код и дайте мне знать, если у вас есть какие-либо вопросы.

protected void submit_Click(object sender, EventArgs e)
    {
        for (int count = 0; count < phControls.Controls.Count; count++)
        {
            UserControl uc = (UserControl)(phControls.Controls[count]);
            if (uc != null)
            {
                RadioButton rdoBtn1 = new RadioButton();
                RadioButton rdoBtn2 = new RadioButton();
                rdoBtn1 = (RadioButton)(uc.FindControl("rdoBtn1"));
                rdoBtn2 = (RadioButton)(uc.FindControl("rdoBtn2"));
                if (rdoBtn1.Checked == true)
                {
                    Response.Write("1st checked ");  
                }
                else if (rdoBtn2.Checked == true)
                {
                    Response.Write("2nd checked"); 
                }

            }
        }
0 голосов
/ 12 июля 2011

Это не лучший дизайн в мире, но вы можете выполнить то, что ищете, с некоторой относительной легкостью.Проблема заключается в том, что страница, на которой расположены эти элементы управления, должна иметь глубокие знания о внутренней работе динамически добавленных элементов управления.И вы захотите, чтобы они реализовали общий абстрактный класс или интерфейс, чтобы вы могли искать нужные по типу.

В следующем коде предполагается, что вы создали свойства для доступа к внутренним элементам управленияценности, а не ссылаться на внутренний контроль самостоятельно.Это просто хорошая практика, когда вы используете какой-либо элемент управления.

protected void submit_Click(object sender, EventArgs e) {
    foreach (var control in phControls.Controls) {
        IMySpecialControl mySpecialControl = control as IMySpecialControl;

        if (mySpecialControl != null) {
            // access some properties (and probably need a cast to the specific control type :(
        }
    }
}

Вместо этого, почему бы просто не получить доступ к полям через коллекцию Request.Form?

string rdoBtn1Value = Request.Form["rdoBtn1"];
...