ASP.NET : 리피터 생성 양식 입력 요소에 액세스하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/179938

  •  05-07-2019
  •  | 
  •  

문제

리피터가 수많은 확인란을 생성하고 싶습니다.

<tr><td><input type="checkbox" name="t" value="11cbf4deb87" /> <input type="checkbox" name="a" value="33cbf4deb87" />stackoverflow.com</td></tr>
<tr><td><input type="checkbox" name="t" value="11cbf4deb88" /> <input type="checkbox" name="a" value="33cbf4deb87" />microsoft.com</td></tr>
<tr><td><input type="checkbox" name="t" value="11cd3f33a89" /> <input type="checkbox" name="a" value="33cbf4deb87" />gmail.com</td></tr>
<tr><td><input type="checkbox" name="t" value="1138fecd337" /> <input type="checkbox" name="a" value="33cbf4deb87" />youporn.com</td></tr>
<tr><td><input type="checkbox" name="t" value="11009efdacc" /> <input type="checkbox" name="a" value="33bf4deb87" />fantasti.cc</td></tr>

질문 1 : 리피터가 실행될 때 각 확인란을 개별적으로 참조하여 고유 한 값을 설정할 수있는 방법은 무엇입니까?

다음과 같은 것과 함께 데이터에 연결합니까?

<itemtemplate>
   <tr>
      <td>
         <input type="checkbox" name="t" 
            value="<%# ((Item)Container.DataItem).TangoUniquifier %>" />
         <input type="checkbox" name="a" 
            value="<%# ((Item)Container.DataItem).AlphaUniquifier %>" />
         <%# ((Item)Container.DataItem).SiteName %>
      </td>
   </tr>
</itemtemplate>

아니면 어떻게 든 onitemdatabound에서 설정해야합니까?

<asp:repeater id="ItemsRepeater" 
      OnItemDataBound="ItemsRepeater_OnItemDataBound" runat="server">
   ...
   <itemtemplate>
      <tr>
         <td>
            <input id="chkTango" type="checkbox" name="t" runat="server" />
            <input id="chkAlpha" type="checkbox" name="a" runat="server" />
            <%# ((Item)Container.DataItem).SiteName %>
         </td>
      </tr>
   </itemtemplate>
   ...
</asp:repeater>


protected void ItemsRepeater_OnItemDataBound(object sender, RepeaterItemEventArgs e)
{
   // if the data bound item is an item or alternating item (not the header etc)
   if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
   {
      // get the associated item
      Item item = (Item)e.Item.DataItem;

      //???
      this.chkTango.Value = item.TangoUniquifier;
      this.chkAlpha.Value = item.AlphaUniquifier;
   }
}

그러나 코드-비만에서 참조해야한다면 코드-비만에서 어떻게 참조합니까? (서버 측) ID 속성을 사용하여 참조해야합니까? <INPUT> 제어? 서버 측의 컨트롤의 ID는 클라이언트에있는 ID와 동일하지 않다는 것을 알고 있습니다.

아니면 "t"라는 이름의 입력 컨트롤과 "a"라는 이름의 입력 컨트롤을 찾아야하는 곳에서 무언가를해야합니까? 그리고 입력 값을 설정할 수있는 확인란은 어떤 종류의 컨트롤입니까?

protected void ItemsRepeater_OnItemDataBound(object sender, RepeaterItemEventArgs e)
{
   // if the data bound item is an item or alternating item (not the header etc)
   if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
   {
      // get the associated item
      Item item = (Item)e.Item.DataItem;

      CheckBox chkTango = (CheckBox)e.Item.FindControl("chkTango");
      chkTango.Value = item.TangoUniquifier;

      CheckBox chkAlpha = (CheckBox)e.Item.FindControl("chkAlpha");
      chkAlpha.Value = item.AlphaUniquifier;
   }
}

질문 2 : 사용자가 나중에 클릭하면 제출할 때 확인 된 모든 확인란 또는 더 구체적으로 해당 값을 어떻게 찾습니까?

찾기해야합니까?

protected void DoStuffWithLinks_Click(object sender, EventArgs e)
{
   // loop through the repeater items
   foreach (RepeaterItem repeaterItem in actionItemRepeater.Items)
   {
      Item item = repeaterItem.DataItem as Item;

      // grab the checkboxes
      CheckBox chkAlpha = (CheckBox)repeaterItem.FindControl("chkAlpha");
      CheckBox chkTango = (CheckBox)repeaterItem.FindControl("chkTango");

      if (chkAlpha.Checked)
      {          
         item.DoAlphaStuff(chkAlpha.Name);
      }

      if (chkTango.Checked)
      {
         item.DoTangoStuff(chkTango.Name);
      }
   }
}

Repeater Items DataItem은 아직 클릭 이벤트 처리기에 있습니까?

도움이 되었습니까?

해결책

입력 제어를 만드는 대신 서버 컨트롤을 사용하여 runat = 서버

 <asp:CheckBox id="whatever" runat="Server" />

item databound에서 값을 설정하면 FindControl을 사용합니다.

CheckBox checkBox = (CheckBox)e.Item.FindControl("whatever");
checkBox.Checked = true;

항목을 받으면 Foreach 구조의 항목에서 FindControl도 사용합니다. 또한 데이터가 어떻게 데이터를 사용하는지에 따라 Postback 이후에 DataItem이 더 이상 존재하지 않을 수 있습니다.

foreach (RepeaterItem item in myRepeater.Items)
{
    if (item.ItemType == ListItemType.Item 
        || item.ItemType == ListItemType.AlternatingItem) 
    { 
        CheckBox checkBox = (CheckBox)item.FindControl("whatever");
        if (checkBox.Checked)
        { /* do something */ }
    }
}
  • 많은 사람들이 as 운영자 FindControl(). 양식에서 제어 이름을 변경할 때 개발 오류를 조용히 무시하고 추적하기가 더 어려워 질 수 있기 때문에 마음에 들지 않습니다. 나는 만 사용하려고 노력한다 as 컨트롤이 보장되지 않으면 운영자.

업데이트 : 어느 확인란이 무엇입니까? 렌더링 된 HTML에서는이 모든 확인란 이름과 같은 모든 확인란을 갖게됩니다.

ctl00_cph0_ParentContainer_MyRepeater_ctl01_MyCheckbox
ctl00_cph0_ParentContainer_MyRepeater_ctl02_MyCheckbox
ctl00_cph0_ParentContainer_MyRepeater_ctl03_MyCheckbox

foreach item.findcontrol ()이 당신을 위해 그들을 얻기 때문에 이름이 무엇인지 신경 쓰지 않으며, 그들에 대해 아무것도 가정해서는 안됩니다. 그러나 Foreach를 통해 반복 할 때는 일반적으로 그것을 다시 언급 할 수있는 방법이 필요합니다. 대부분의 경우 이것은 각 확인란과 함께 ASP : Hiddenfield 컨트롤을 사용하여 식별자를 보유하여 올바른 엔티티에 다시 일치시킵니다.

보안 메모: 숨겨진 필드를 JavaScript에서 변경할 수 있기 때문에 숨겨진 필드를 사용하는 데있어 보안 문제가 있습니다. 양식이 제출되기 전에이 값을 사용자가 수정했을 수 있음을 항상 의식하십시오.

다른 팁

CheckBoxList 컨트롤을 사용하는 것이 더 쉬울 수 있습니다.

간단한 경우, DataTextVield와 DataValuefield를 DataSource에서 가져온 이름과 값으로 설정 한 다음 (DataSource에서 채워져 있다고 가정 한 후) 항목을 생성하기 위해 바인딩합니다.

아마도 리피터에서 확인란을 만드는 것보다 작업이 적을 수 있습니다.

다음은 숨겨진 필드를 처리하는 방법에 대한 특정 코드입니다.

마크 업 :

<asp:HiddenField ID="repeaterhidden" Value='<%# DataBinder.Eval(Container.DataItem, "value")%>' runat="server" >

씨#:

{

HiddenField hiddenField = (HiddenField)item.FindControl(repeaterStringhidden);

{ /* do something with hiddenField.Value */

}

나는이 KB가 나에게 최선의 대답을 주었다고 믿는다.

http://msdn.microsoft.com/en-us/library/1d04y8ss.aspx

저의 운이 부족한 경우, 이것은 .NET 4.0 버전에서만 사용할 수있는 것 같습니다 (그리고 여전히 3.5 SP1에 갇혀 있습니다).

인용 (Bold Is Mine) :

컨트롤이 컨트롤의 반복 된 인스턴스를 생성하는 데이터 바운드 컨트롤 내부에 있으면 ASP.Net은 생성합니다. 각 인스턴스에 대해 고유하고 클라이언트 값 통제의. 고유 한 값은 명명 컨테이너의 고유 한 값, 컨트롤의 ID 값 및 순차적 숫자를 결합하여 생성됩니다. 이것은 Datalist와 같은 컨트롤의 경우입니다. 연발총, GridView 및 ListView Control.

ASP.NET는 ClientIdMode 속성이 Autoid로 설정 될 때 유사한 방식으로 ClientID 값을 생성합니다. 일반적으로 사용되는 순차적 숫자의 값을 예측할 수 없기 때문에 클라이언트 스크립트에서 컨트롤을 참조하기가 어려울 수 있습니다. 클라이언트 스크립트에서 데이터 바운드 컨트롤에 액세스하려면 ClientIdMode 속성을 예측 가능하게 설정하십시오. 따라서 ClientID 값이 무엇인지 쉽게 예측할 수 있습니다.

clientIdMode를 예측 가능한 것으로 설정하면 또한 ClientIdrowSuffixDatakeys 속성을 고유 한 데이터 필드의 이름으로 설정합니다., 데이터베이스 테이블의 기본 키와 같은. 이로 인해 ASP.NET은 데이터 키 값을 예측할 수있는 경우 클라이언트 스크립트에서 더 쉽게 예측하고 참조 할 수있는 클라이언트 ID를 생성하게됩니다.

버전 3.5에서 숨겨진 필드를 사용하여 수행하고 있습니다.

    foreach (RepeaterItem item in rptClientes.Items)
    {
        Panel pnl = (Panel)item.FindControl("divCliente");
        Control c = pnl.FindControl("hdnID");
        if (c is HiddenField)
        {
            if (((HiddenField)c).Value == hdnClienteNome.Value)
                pnl.BackColor = System.Drawing.Color.Beige;
        }
    }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top