2011-09-07 6 views

답변

14

템플릿 열을 사용하는 경우 데이터 바인딩 표현식을 사용하여 마크 업에서 드롭 다운을 바인딩 할 수 있습니다. 예 :

<asp:TemplateField HeaderText="XYZ"> 
    <ItemTemplate> 
    <asp:DropDownList runat="server" ID="MyDD" DataSourceId="MyDataSource" /> 
    </ItemTemplate> 
</asp:TemplateField> 

위의 예는 드롭 다운 데이터가 여러 행에 걸쳐 일정하다고 가정합니다. 이 변화 경우에 당신은 GetDropDownData이 지정된 행의 데이터 (데이터 테이블,리스트, 배열)을 반환하는 코드 숨김에서 보호 방법이 될 것 같은

<asp:DropDownList runat="server" DataSource='<%# GetDropDownData(Container) %>' DataTextField="Text" DataValueField="Value" /> 

로 데이터 바인딩 식을 사용할 수 있습니다.

코드 숨김에서 GridView.RowDataBound 이벤트 (또는 RowCreated 이벤트)를 사용하여 드롭 다운을 채울 수 있습니다. 예를 들어,

protected void GridView_RowDataBound(Object sender, GridViewRowEventArgs e) 
    { 

    if(e.Row.RowType == DataControlRowType.DataRow) 
    { 
     // Find the drop-down (say in 3rd column) 
     var dd = e.Row.Cells[2].Controls[0] as DropDownList; 
     if (null != dd) { 
     // bind it 
     } 

     /* 
     // In case of template fields, use FindControl 
     dd = e.Row.Cells[2].FindControl("MyDD") as DropDownList; 
     */ 
    } 

    } 
+0

어떤 것입니까? 다른 하나를 선호하는 이유가 있을까요? – Tim

+0

@Tim, RowCreated도 작동합니다. 그러나 첫 번째 시간에만 그리드를 바인딩하는 경우 (그리고 포스트 백이 아님) 'RowCreated'는 확실히 모든 포스트 백에서 실행되지만 'RowDataBound'에서는 발생하지 않을 것이라고 확신합니다 (여기서는 100 % 확신하지 못합니다). 따라서 이러한 경우에는 드롭 다운을 채우기 위해 뷰 상태에 의존 할 수 있습니다. 개인적으로 나는 마크 업 경로를 선호한다. – VinayC

+0

코드에서 SQL 인스턴스를 선언했다고 가정합니다. 코드에서 그리드 뷰를 이미 바인딩 한 경우 다른 솔루션이 필요합니다. 즉, DataSourceId = "MyDataSource" –

15

는 제안 된 방법 이외에, 당신은이 방법으로, 마크 업 내에서 컨트롤을 바인딩 할 수 있습니다

<asp:GridView ID="MyGrid" runat="server" DataSourceID="MyDataSource1"> 
    <Columns> 
     <asp:TemplateField> 
      <EditItemTemplate> 
       <asp:DropDownList ID="DropDownList1" runat="server" SelectedValue='<%# Bind ("CustomerId") %>' DataSourceID="CustomersDataSource" DataTextField="CustomerName" DataValueField="CustomerId" > 
       </asp:DropDownList> 
      </EditItemTemplate> 
     </asp:TemplateField> 
    </Columns> 
</asp:GridView> 
+1

+1을 사용하여 마크 업을 통해 예제를 제공 할 수 없기 때문입니다. – Tim

+1

@Tim : 고마워요. :) –

+1

@Efran이게 내 문제를 해결해 줬어. 감사. – htm11h

-1
protected void gvSalesAppData_RowDataBound(Object sender, GridViewRowEventArgs e) 

    { 

     if (e.Row.RowType == DataControlRowType.DataRow) 
     { 

      DropDownList ddlCurrentPhase = (DropDownList)e.Row.FindControl("ddlCurrentPhase"); 
      DropDownList ddlProductFamily = (DropDownList)e.Row.FindControl("ddlProductFamily"); 
      DropDownList ddlProductGroup = (DropDownList)e.Row.FindControl("ddlProductGroup"); 
      DropDownList ddlETProgramManager = (DropDownList)e.Row.FindControl("ddlETProgramManager"); 
      DropDownList ddlPLMForTheProduct = (DropDownList)e.Row.FindControl("ddlPLMForTheProduct"); 

      TrackingToolObj.BindCurrentPhases(ddlCurrentPhase); 
      TrackingToolObj.BindCurrentPhases(ddlProductFamily); 
      TrackingToolObj.BindProductGroups(ddlProductGroup); 
      TrackingToolObj.GetEmployeesBasedOnRoleTypeId(ddlETProgramManager, (int)OSAEnums.RoleTypes.ProgramManager, false); 
      TrackingToolObj.GetEmployeesBasedOnRoleTypeId(ddlPLMForTheProduct, (int)OSAEnums.RoleTypes.PLM, false); 


     } 

    } 
-2

가의 GridView

바인딩 아래는 GridView 컨트롤을 데이터로 바인딩하는 코드 여기

C#을

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsPostBack) 
    { 
    this.BindData(); 
    } 
} 

private void BindData() 
{ 
    string query = "SELECT top 10 * FROM Customers";  
    SqlCommand cmd = new SqlCommand(query);  
    gvCustomers.DataSource = GetData(cmd);  
    gvCustomers.DataBind(); 
} 

private DataTable GetData(SqlCommand cmd) 
{  
    string strConnString = ConfigurationManager.ConnectionStrings["conString"].ConnectionString;  
    using (SqlConnection con = new SqlConnection(strConnString)) 
    {   
     using (SqlDataAdapter sda = new SqlDataAdapter())  
     {    
      cmd.Connection = con;    
      sda.SelectCommand = cmd;    
      using (DataTable dt = new DataTable()) 
      {     
       sda.Fill(dt);     
       return dt; 
      }  
     } 
    } 
} 
+0

답을 수정하고 코드를 읽을 수 있도록 형식을 지정하십시오. – kleopatra

+2

솔직히 말하면, 그렇게하는 것이 좋습니다. gridview에 500 개의 행이 있다면 데이터베이스를 500 번 쿼리 할 것입니까? 이 작업을 수행해야하는 경우 드롭 다운 목록의 항목에 대한 데이터로 데이터 집합을 채우고 위에 표시된 것처럼 RowDataBound 이벤트에서 DataSet을 드롭 다운 목록에 바인딩합니다. –

1

은 gridview에

<asp:GridView ID="grvExcelData" runat="server" onrowdatabound="GridView2_RowDataBound"> 
    <HeaderStyle BackColor="#df5015" Font-Bold="true" ForeColor="White" /> 
     <Columns> 
      <asp:TemplateField> 
       <ItemTemplate> 
       <asp:DropDownList ID="DrdDatabase" Width="100px" runat="server"> 
       </asp:DropDownList> 
       </ItemTemplate> 
      </asp:TemplateField> 
     </Columns> 
    </asp:GridView> 

하고있는 gridview에 대한 RowDataBound 이벤트는 RowCreated 이벤트에 대한

protected void GridView2_RowDataBound(object sender, GridViewRowEventArgs e) 
    { 
     string cities = "maxico,chennai,newdelhi,hongkong"; 
     string [] arr = cities.Split(','); 
    // Instead of string array it could be your data retrieved from database. 
     if (e.Row.RowType == DataControlRowType.DataRow) 
     { 
      DropDownList ddl = (DropDownList)e.Row.FindControl("DrdDatabase"); 
      foreach (string colName in arr) 
       ddl.Items.Add(new ListItem(colName)); 
     } 
    } 
+0

이것은 데이터베이스에 바인딩되어있는 대신 도시 배열에 연결되어있는 것처럼 보입니다. 사용자가 드롭 다운을 변경하면 데이터베이스가 어떻게 업데이트됩니까? –

관련 문제