2013-05-17 3 views
1

GridView에서 행을 편집 할 때 사용 가능한 값 목록이 행의 다른 열에 종속적 인 DropDownList가 필요합니다 ("type" 지금은 기록 중); 즉, 편집중인 행에 따라 다른 옵션이 나열됩니다.다른 열 값에 따라 GridView EditItemTemplate에 DropDownList를 채우는 방법

다른 방법으로 불필요한 DataKeyName을 GridView에 추가하여 멋지게 만들었지 만, 다른 곳에서 슬픔을 느끼게하고 어쨌든 너무 간결하다고 느끼기 때문에 더 나은 방법을 찾고 있습니다. 에서 .aspx 파일에서

: 여기에 내가 현재 그것을하고있어 방법

<asp:GridView ID="gvDct" ... DataKeyNames="dctId,dctType" ... > 
    ... 
    <asp:TemplateField> 
    ... 
    <EditItemTemplate> 
     <asp:DropDownList ID="ddlDctParent" runat="server" 
      DataSourceId="sdsDctParent" 
      DataValueField="dctId" DataTextField="dctFullPath" 
      SelectedValue='<%# Bind("dctParentId") %>' 
      ... > 
     </asp:DropDownList> 
     <asp:SqlDataSource ID="sdsDctParent" runat="server" 
      ConnectionString="<%$ ConnectionStrings:ConnectionString %>" 
      OnSelecting="sdsDctParent_Selecting" 
      SelectCommand="SELECT dctId, dctFullPath FROM lkpDocCatAndType 
          WHERE [email protected]"> 
     <SelectParameters> 
      <asp:Parameter Name="dctType" /> 
     </SelectParameters> 
     </asp:SqlDataSource> 
    </EditItemTemplate> 
    </asp:TemplateField> 
    ... 
</asp:GridView> 

나는 컨트롤의 controlid = "gvDct"와 ControlParameter가되도록 SelectParameter를 원하고 PROPERTYNAME = "SelectedDataKey.Values ​​[dctType]" , 그러나 작동하지 않는 알 수없는 이유로 (매개 변수 값이 null),이 비트를 .vb 코드 숨김 파일에 추가하여 DropDownList의 데이터 소스에 대한 행 특정 매개 변수를 채 웁니다.

Protected Sub sdsDctParent_Selecting(ByVal sender As Object, _ 
      ByVal e As System.Web.UI.WebControls.SqlDataSourceSelectingEventArgs) 
    e.Command.Parameters(0).Value = gvDct.DataKeys(gvDct.EditIndex).Item(1) 
End Sub 

그래서 GridView에서 행 편집을 시작하면 DropDownL ist가 바인딩되면 SqlDataSource SelectCommand가 실행되어 OnSelecting 코드가 실행되어 DropDownList에 적절한 값 채우기를 얻을 수 있도록 편집중인 행 (EditIndex)에서 매개 변수 값을 제공합니다.

"더 나은"방법이 있습니까? 나를 위해 가장 중요한 측면은 GridView에서 행을 삭제하는 데 사용하는 저장 프로 시저에 너무 많은 매개 변수 문제를 일으키기 때문에 DataKeyName을 추가하지 않는 것입니다.

+0

같은 일을 위의 코드가 SQL 주입하는 경향이 아닌가요 시도 할 수 있습니다? – bonCodigo

답변

0

당신이 valueID에게 Dropdownlist도 그 값이 C#에서 코드를 작성하기위한 드롭 다운리스트
SRY를 채울하려는 label/hidden 필드를 추가 채울 수 있습니다 당신에 이상을 가져올 수있는 당신은 GRIDVIEW RowDataBound를 사용해야합니다.

protected void gvDct_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
    if ((e.Row.RowState & DataControlRowState.Edit) > 0) 
    { 
     Label lblValue = (Label)e.Row.FindControl("YourLableID") 
     DropDownList ddList= (DropDownList)e.Row.FindControl("ddlDctParent"); 
     //bind dropdownlist 
     DataTable dt = con.GetData("Select Query where YourColumn='"+lblValue.text+"'"); 
     ddList.DataSource = dt; 
     ddList.DataTextField = "dctFullPath"; 
     ddList.DataValueField = "dctId"; 
     ddList.DataBind(); 

     DataRowView dr = e.Row.DataItem as DataRowView; 
     ddList.SelectedValue = dr["dctId"].ToString(); 
    } 
    } 
} 
+1

GridViewEditEventArgs에 Row 속성이 없습니다. 대신 GridViewRowEventArgs를 사용하십시오. – concept

+0

RowCommand 이벤트가 RowDataBound보다 좋을까요? – bonCodigo

관련 문제