2009-09-11 64 views
1

我有一個GridView控件,我想要有2個可見字段,一個標籤和一個下拉列表。我沒有使用RowEditTemplate,而是希望將ItemTemplate定義爲下拉值。從GridView上更新下拉列表更改

關於下拉改變的事件,我想執行一些代碼,我可以得到該gridview行的整數鍵,以及下拉的新選定值。像下面這樣:

<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> 

後面的代碼

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) 
} 

下拉填充和價值選擇的正確,但我不能讓下拉菜單刪除或更新才能正常工作。我嘗試過實現這些功能,但當下拉菜單觸發回發時,RowCommand似乎不會觸發。即使它確實觸發,我不知道如何獲得我需要的值。有更好的方法我應該去做這件事嗎?

+1

棘手。 ViewState是否爲頁面啓用? – 2009-09-12 03:22:51

+0

Yeah ViewState已啓用。 – 2009-09-12 17:41:08

回答

1

我注意到你的代碼中有一件事你在頁面加載時調用了GridView2.DataBind()。試着把它放在Page Prerender中,因爲當一個事件被觸發時它會調用頁面加載,並且你的gridview會刷新該事件被處理....

但它並不總是,它會導致問題

+0

非常好的一點,當我嘗試使用其他解決方案時,實際上確實造成了問題。我用你的建議,它運作得很好。謝謝! – 2009-09-14 21:46:33

0

儘量把這段代碼在你的頁面加載

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

這個「會解決你的問題