2009-05-07 6 views
23

표시 할 때 선택한 값을 문자열로 표시하고 DropDownList를 표시하여 지정된 값을 선택할 수 있도록 ASP.NET 3.5 GridView를 가져 오려고합니다. 편집 할 때 옵션 목록. 충분히 간단한 것 같니?Gridview 행 편집 - DropDownList에 대한 동적 바인딩

내있는 gridview이 (간체)과 같습니다되지는 편집 모드 때

<asp:GridView ID="grvSecondaryLocations" runat="server" 
       DataKeyNames="ID" OnInit="grvSecondaryLocations_Init" 
       OnRowCommand="grvSecondaryLocations_RowCommand" 
       OnRowCancelingEdit="grvSecondaryLocations_RowCancelingEdit" 
       OnRowDeleting="grvSecondaryLocations_RowDeleting" 
       OnRowEditing="grvSecondaryLocations_RowEditing" 
       OnRowUpdating="grvSecondaryLocations_RowUpdating" > 
<Columns> 
    <asp:TemplateField> 
     <ItemTemplate> 
       <asp:Label ID="lblPbxTypeCaption" runat="server" 
           Text='<%# Eval("PBXTypeCaptionValue") %>' /> 
     </ItemTemplate> 
     <EditItemTemplate> 
         <asp:DropDownList ID="ddlPBXTypeNS" runat="server" 
           Width="200px" 
           DataTextField="CaptionValue" 
           DataValueField="OID" /> 
     </EditItemTemplate> 
    </asp:TemplateField> 
</asp:GridView> 

그리드는 OK 표시됩니다 - 선택한 PBX 유형이 ASP에서 그 값을 보여줍니다 Label 컨트롤을. 놀랍지도 않습니다.

양식의 OnLoad 이벤트에서 _pbxTypes이라는 로컬 멤버에 DropDownList의 값 목록을로드합니다. 나는 이것을 확인했다. 그것은 효과적이다.

이제 도전 과제는 그리드가 특정 행에 대한 편집 모드가되면 _pbxTypes에 저장된 PBX 목록을 바인드해야합니다. 충분히

간단하고 나는 생각했다 - 단지 RowEditing 이벤트 목록 개체 드롭 다운을 잡고 목록을 첨부 :

protected void grvSecondaryLocations_RowEditing(object sender, GridViewEditEventArgs e) 
{ 
    grvSecondaryLocations.EditIndex = e.NewEditIndex; 

    GridViewRow editingRow = grvSecondaryLocations.Rows[e.NewEditIndex]; 

    DropDownList ddlPbx = (editingRow.FindControl("ddlPBXTypeNS") as DropDownList); 
    if (ddlPbx != null) 
    { 
     ddlPbx.DataSource = _pbxTypes; 
     ddlPbx.DataBind(); 
    } 

    .... (more stuff) 
} 

문제는 - 나는 FindControl 호출에서 다시 아무것도 결코 - ddlPBXTypeNS 것 같아 존재하지 않습니다 (또는 찾을 수 없습니다).

무엇이 부족합니까 ?? 정말 바보 같은 게 틀림 없어.하지만 지금까지, 내 ​​모든 인터넷 검색, GridView 컨트롤에 대한 읽기, 친구 묻기는 도움이되지 못했습니다.

누가 누락 된 링크를 발견 할 수 있습니까? ;-)

답변

27

해당 이벤트에 의해 컨트롤이 없기 때문에 ... 당신은 잘못하고있어 아주 쉽게 :이다

protected void gv_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow && 
     (e.Row.RowState & DataControlRowState.Edit) == DataControlRowState.Edit) 
    { 
     // Here you will get the Control you need like: 
     DropDownList dl = (DropDownList)e.Row.FindControl("ddlPBXTypeNS"); 
    } 
} 

, 그것은 단지 유효합니다 DataRow (데이터가있는 실제 행)이고 인 경우 편집 모드 ... 한 번에 하나의 행만 편집하기 때문입니다. e.Row.FindControl("ddlPBXTypeNS")은 원하는 컨트롤 만 찾습니다.

+1

Tricky ....이 이벤트가 발생하지만 RowState는 "Alternate | Edit"입니다 - 귀하의 IF는 결코 사실이 아닙니다 :-) –

+0

OK, "Edit"비트가 설정되어 있는지 확인합니다. (설정 될 수있는 다른 비트는 무시함) 이제는 매력처럼 작동합니다! 고마워요! –

+0

그냥 코드 : – balexandre

1

3.5의 GridView 대신 ListView를 사용하고 있습니다. 사용자가 편집하려고 할 때 드롭 다운의 선택된 항목을 레코드의 해당 열의 exising 값으로 설정했습니다. ItemDataBound 이벤트의 드롭 다운에 액세스 할 수 있습니다. 여기 코드는 다음과 같습니다

protected void listViewABC_ItemDataBound(object sender, ListViewItemEventArgs e) 
{ 
    // This stmt is used to execute the code only in case of edit 
    if (((ListView)(sender)).EditIndex != -1 && ((ListViewDataItem)(e.Item)).DisplayIndex == ((ListView)(sender)).EditIndex) 
    { 
     ((DropDownList)(e.Item.FindControl("ddlXType"))).SelectedValue = ((MyClass)((ListViewDataItem)e.Item).DataItem).XTypeId.ToString(); 
     ((DropDownList)(e.Item.FindControl("ddlIType"))).SelectedValue = ((MyClass)((ListViewDataItem)e.Item).DataItem).ITypeId.ToString(); 
    } 
} 
+0

이이 목록은 GRIDVIEW입니다 아니에요! – balexandre

+0

정확하게 - 그리고 나는 가능하다면 그것을 작동 시키려면 단지 그것을 변경하고 싶지 않습니다 ..... 어쨌든 고마워요! –

+1

balexandre ... i hav는 이미 그리드 뷰가 아니라고 말했어 ... 이것은 단지 투자액이 아니었지만 ... 다른 사람들보다 '잘못된 답'에 -ve 포인트를주는 것을 배우면 더 좋을 것이다. 또는 fyis ' –

0

당신은 SelectedValue를 사용할 수 있습니다

<EditItemTemplate> 
    <asp:DropDownList ID="ddlPBXTypeNS" 
         runat="server" 
         Width="200px" 
         DataSourceID="YDS" 
         DataTextField="CaptionValue" 
         DataValueField="OID" 
         SelectedValue='<%# Bind("YourForeignKey") %>' /> 
    <asp:YourDataSource ID="YDS" ...../> 
</EditItemTemplate> 
1
protected void grvSecondaryLocations_RowEditing(object sender, GridViewEditEventArgs e) 
{ 
    grvSecondaryLocations.EditIndex = e.NewEditIndex; 

    DropDownList ddlPbx = (DropDownList)(grvSecondaryLocations.Rows[grvSecondaryLocations.EditIndex].FindControl("ddlPBXTypeNS")); 
    if (ddlPbx != null) 
    { 
     ddlPbx.DataSource = _pbxTypes; 
     ddlPbx.DataBind(); 
    } 

    .... (more stuff) 
} 
0

answer from balexandre이 잘 작동 확인. 그러나 다른 상황에 적응 시키면 문제가 될 수 있습니다. '업데이트'에 대한 DB에 저장 될 수 올바른 ModifiedBy 있도록하고 ModifiedOn, 내가 행을 편집 한 - lblEditModifiedBylblEditModifiedOn -

나는 두 개의 레이블 컨트롤의 값을 변경하는 데 사용했다.

'업데이트'버튼을 클릭하면 RowUpdating 이벤트에서 OldValues 목록에 입력 한 새 값이 표시됩니다.데이터베이스를 업데이트 할 때 Original_value로 true "이전 값"이 필요했습니다. (AN ObjectDataSourceGridView에 붙어있다.)

이에 대한 수정이 gv_DataBound 이벤트에 balexandre의 코드를 사용하지만, 변형 된 형태로되어

protected void gv_DataBound(object sender, EventArgs e) 
{ 
    foreach (GridViewRow gvr in gv.Rows) 
    { 
     if (gvr.RowType == DataControlRowType.DataRow && (gvr.RowState & DataControlRowState.Edit) == DataControlRowState.Edit) 
     { 
      // Here you will get the Control you need like: 
      ((Label)gvr.FindControl("lblEditModifiedBy")).Text = Page.User.Identity.Name; 
      ((Label)gvr.FindControl("lblEditModifiedOn")).Text = DateTime.Now.ToString(); 
     } 
    } 
} 
-1
<asp:GridView ID="GridView1" runat="server" PageSize="2" AutoGenerateColumns="false" 
      AllowPaging="true" BackColor="White" BorderColor="#CC9966" BorderStyle="None" 
      BorderWidth="1px" CellPadding="4" OnRowEditing="GridView1_RowEditing" OnRowUpdating="GridView1_RowUpdating" 
      OnPageIndexChanging="GridView1_PageIndexChanging" OnRowCancelingEdit="GridView1_RowCancelingEdit" 
      OnRowDeleting="GridView1_RowDeleting"> 
      <FooterStyle BackColor="#FFFFCC" ForeColor="#330099" /> 
      <RowStyle BackColor="White" ForeColor="#330099" /> 
      <SelectedRowStyle BackColor="#FFCC66" Font-Bold="True" ForeColor="#663399" /> 
      <PagerStyle BackColor="#FFFFCC" ForeColor="#330099" HorizontalAlign="Center" /> 
      <HeaderStyle BackColor="#990000" Font-Bold="True" ForeColor="#FFFFCC" /> 
      <Columns> 
      <asp:TemplateField HeaderText="SerialNo"> 
      <ItemTemplate> 
      <%# Container .DataItemIndex+1 %>.&nbsp 
      </ItemTemplate> 
      </asp:TemplateField> 
       <asp:TemplateField HeaderText="RollNo"> 
        <ItemTemplate> 
         <%--<asp:Label ID="lblrollno" runat="server" Text='<%#Eval ("RollNo")%>'></asp:Label>--%> 
         <asp:TextBox ID="txtrollno" runat="server" Text='<%#Eval ("RollNo")%>'></asp:TextBox> 
        </ItemTemplate> 
       </asp:TemplateField> 
       <asp:TemplateField HeaderText="SName"> 
        <ItemTemplate> 
        <%--<asp:Label ID="lblsname" runat="server" Text='<%#Eval("SName")%>'></asp:Label>--%> 
         <asp:TextBox ID="txtsname" runat="server" Text='<%#Eval("SName")%>'> </asp:TextBox> 
        </ItemTemplate> 
       </asp:TemplateField> 
       <asp:TemplateField HeaderText="C"> 
        <ItemTemplate> 
        <%-- <asp:Label ID="lblc" runat="server" Text='<%#Eval ("C") %>'></asp:Label>--%> 
         <asp:TextBox ID="txtc" runat="server" Text='<%#Eval ("C") %>'></asp:TextBox> 
        </ItemTemplate> 
       </asp:TemplateField> 
       <asp:TemplateField HeaderText="Cpp"> 
        <ItemTemplate> 
        <%-- <asp:Label ID="lblcpp" runat="server" Text='<%#Eval ("Cpp")%>'></asp:Label>--%> 
         <asp:TextBox ID="txtcpp" runat="server" Text='<%#Eval ("Cpp")%>'> </asp:TextBox> 
        </ItemTemplate> 
       </asp:TemplateField> 
       <asp:TemplateField HeaderText="Java"> 
        <ItemTemplate> 
         <%-- <asp:Label ID="lbljava" runat="server" Text='<%#Eval ("Java")%>'> </asp:Label>--%> 
         <asp:TextBox ID="txtjava" runat="server" Text='<%#Eval ("Java")%>'> </asp:TextBox> 
        </ItemTemplate> 
       </asp:TemplateField> 
       <asp:TemplateField HeaderText="Edit" ShowHeader="False"> 
        <EditItemTemplate> 
         <asp:LinkButton ID="lnkbtnUpdate" runat="server" CausesValidation="true" Text="Update" 
          CommandName="Update"></asp:LinkButton> 
         <asp:LinkButton ID="lnkbtnCancel" runat="server" CausesValidation="false" Text="Cancel" 
          CommandName="Cancel"></asp:LinkButton> 
        </EditItemTemplate> 
        <ItemTemplate> 
         <asp:LinkButton ID="btnEdit" runat="server" CausesValidation="false" CommandName="Edit" 
          Text="Edit"></asp:LinkButton> 
        </ItemTemplate> 
       </asp:TemplateField> 
       <asp:CommandField HeaderText="Delete" ShowDeleteButton="True" ShowHeader="True" /> 
       <asp:CommandField HeaderText="Select" ShowSelectButton="True" ShowHeader="True" /> 
      </Columns> 
     </asp:GridView> 
     <table> 
      <tr> 
       <td> 
        <asp:Label ID="lblrollno" runat="server" Text="RollNo"></asp:Label> 
        <asp:TextBox ID="txtrollno" runat="server"></asp:TextBox> 
       </td> 
       <td> 
        <asp:Label ID="lblsname" runat="server" Text="SName"></asp:Label> 
        <asp:TextBox ID="txtsname" runat="server"></asp:TextBox> 
       </td> 
       <td> 
        <asp:Label ID="lblc" runat="server" Text="C"></asp:Label> 
        <asp:TextBox ID="txtc" runat="server"></asp:TextBox> 
       </td> 
       <td> 
        <asp:Label ID="lblcpp" runat="server" Text="Cpp"></asp:Label> 
        <asp:TextBox ID="txtcpp" runat="server"></asp:TextBox> 
       </td> 
       <td> 
        <asp:Label ID="lbljava" runat="server" Text="Java"></asp:Label> 
        <asp:TextBox ID="txtjava" runat="server"></asp:TextBox> 
       </td> 
      </tr> 
      <tr> 
       <td> 
        <asp:Button ID="Submit" runat="server" Text="Submit" OnClick="Submit_Click" /> 
        <asp:Button ID="Reset" runat="server" Text="Reset" OnClick="Reset_Click" /> 
       </td> 
      </tr> 
     </table> 
+2

StackOverflow에 오신 것을 환영합니다. 코드, XML 또는 데이터 샘플을 게시하는 경우 ** 텍스트 편집기에서 해당 줄을 강조 표시하십시오. 편집기 툴바에서 "코드 샘플"버튼 ('{}) '을 클릭하여 멋지게 형식을 지정하고 구문을 강조 표시하십시오! –