2011-09-07 40 views

Respuesta

14

Si está utilizando una columna de plantilla, puede vincular el menú desplegable del marcado utilizando expresiones de enlace de datos. Por ejemplo,

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

Above está asumiendo que sus datos desplegables son constantes en todas las filas. Si se está cambiando a continuación, puede utilizar la expresión de enlace de datos tales como

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

GetDropDownData será un método protegido en el código subyacente que devolverá los datos (tabla de datos, lista, matriz) para la fila dada.

Puede usar el evento GridView.RowDataBound (o evento RowCreated) en el código subyacente para rellenar los menús desplegables. Por ejemplo,

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

¿Qué pasa con el caso RowCreated? ¿Hubiera una razón para preferir uno sobre el otro? – Tim

+0

@Tim, RowCreated también funcionará. Sin embargo, creo que si estás enlazando la cuadrícula solo la primera vez (y no en la posterior), 'RowCreated' ciertamente se activará en cada post-back pero no en 'RowDataBound' (no estoy 100% seguro aquí). Entonces, en tal caso, podemos confiar en view-state para completar el menú desplegable. Personalmente, prefiero la ruta de marcado. – VinayC

+0

Se supone que tiene su instancia SQL declarada en su código. Si ya vinculó su vista de cuadrícula en su código, entonces debe haber una solución diferente, porque no podría usar DataSourceId = "MyDataSource" –

15

Además de los métodos propuestos, es posible que también se unen a sus controles dentro de su margen de beneficio, de esta manera:

<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 para dar un ejemplo de hacerlo a través del marcado :) – Tim

+1

@Tim : Gracias :) –

+1

@Efran esto funcionó para mi problema. Gracias. – 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

Encuadernación GridView

A continuación se el código para enlazar el control GridView con datos.

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

por favor edite su respuesta y formatee el código para que sea legible – kleopatra

+2

Para ser honesto, esa es una forma tonta de hacerlo. Si tiene 500 filas en una vista de cuadrícula, ¿consultará una base de datos 500 veces? Cuando tengo que hacer esto, llené un conjunto de datos con los datos de los elementos en la lista desplegable y, como se muestra arriba, en el evento RowDataBound, vinculo el conjunto de datos a las listas desplegables. –

1

Aquí es su 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> 

y su evento RowDataBound para el gridview habría

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

Esto no parece que esto esté vinculado a una base de datos, sino que se adjunta a una matriz de ciudades. Si un usuario realiza un cambio en el menú desplegable, ¿cómo actualizará la base de datos? –

Cuestiones relacionadas