2009-09-11 5 views
1

J'ai un contrôle GridView que je veux avoir 2 champs visibles, une étiquette et une liste déroulante. Au lieu d'utiliser un RowEditTemplate, j'espérais juste définir le ItemTemplate comme étant la valeur déroulante.Mise à jour à partir de GridView on Dropdown modifié

Dans le cas où une liste déroulante est modifiée, je veux exécuter du code où je peux obtenir la clé entière pour cette ligne gridview, et la nouvelle valeur sélectionnée de la liste déroulante. Quelque chose comme ce qui suit:

<asp:GridView ID="GridView2" runat="server" AutoGenerateColumns="False" 
     DataKeyNames="pk_id" onrowdeleting="GridView2_RowDeleting" 
     onrowcommand="GridView2_RowCommand"> 
     <Columns> 
      <asp:BoundField DataField="pk_id" Visible="False" /> 
      <asp:BoundField DataField="Column1" HeaderText="Column1" /> 
      <asp:TemplateField HeaderText="Column2"> 
       <ItemTemplate> 
        <asp:DropDownList ID="DropDownList3" runat="server" 
         DataSourceID="SqlDataSource" DataTextField="name" 
         DataValueField="id2" 
         SelectedValue='<%# Bind("id2") %>' 
         AutoPostBack="True"> 
        </asp:DropDownList> 
        <asp:SqlDataSource ID="SqlDataSource" runat="server" 
         ConnectionString="<%$ ConnectionStrings:Main %>" 
         SelectCommand="get_TestData" SelectCommandType="StoredProcedure"> 
        </asp:SqlDataSource> 
       </ItemTemplate> 
      </asp:TemplateField> 
      <asp:CommandField ShowDeleteButton="True" /> 
     </Columns> 
    </asp:GridView> 

CODE DERRIÈRE

protected void Page_Load(object sender, EventArgs e) 
{ 
    ... 
    GridView2.DataSource = new Person(id).GetDataSet(); 
    GridView2.DataBind(); 
} 
protected void GridView2_RowDeleting(object sender, GridViewDeleteEventArgs e) 
{ 
    // Call delete function with the key 
    // Delete(key); 
} 
protected void GridView2_RowCommand(object sender, GridViewCommandEventArgs e) 
{ 
    // figure out which row sent it 
    // UpdateRecord(key, newvalue) 
} 

La liste déroulante est remplie et la valeur sélectionnée correctement, mais je ne peux pas obtenir la suppression ou la mise à jour par menu déroulant pour fonctionner correctement. J'ai essayé d'implémenter ces fonctions, mais le RowCommand ne semble pas déclencher lorsque la liste déroulante déclenche une publication. Même si cela se déclenche, je ne suis pas sûr de savoir comment obtenir les valeurs dont j'ai besoin. Y a-t-il une meilleure façon de m'y prendre?

+1

Tricky. Est-ce que ViewState est activé pour la page? –

+0

Ouais ViewState est activé. –

Répondre

1

J'ai remarqué une chose dans votre code que vous avez appelée GridView2.DataBind() au chargement de la page .... essayez de le mettre dans la page Prerender parce qu'un événement déclenche le chargement de la page et le gridview sera actualisé avant l'événement est géré ....

mais il est pas toujours qu'il provoque des problèmes

+0

Très bon point, lorsque j'ai essayé d'utiliser l'autre solution, cela a posé un problème. J'ai utilisé votre suggestion et cela a très bien fonctionné. Merci! –

0

essayer de mettre ce code dans votre charge

protected void Page_Load(object sender, EventArgs e) 
{ 
    if(!isPostback) 
    { 
    GridView2.DataSource = new Person(id).GetDataSet(); 
    GridView2.DataBind(); 
    } 
} 

cette vais résoudre votre problème

Questions connexes