2013-12-14 46 views
1

我想更新行更新中的GridView中的值。但是,它拒絕接受文本框中寫入的值。如果頁面不回發,我填充gridview。幫幫我!OnRowUpdating沒有獲取編輯模板文本框的值

GRIDVIEW:

<asp:UpdatePanel runat="server" UpdateMode=Conditional><ContentTemplate> 
    <asp:GridView runat="server" ID="searchGV" AutoGenerateColumns="False" GridLines="None" 
     CssClass="mGrid" EmptyDataText="The Search Did Not Return Any Results" 
     PagerStyle-CssClass="pgr" AlternatingRowStyle-CssClass="alt" Width="100%" OnRowCancelingEdit="searchGV_RowCancelingEdit" 
     OnRowEditing="searchGV_RowEditing" DataKeyNames="media_id" OnRowUpdating="searchGV_RowUpdating"> 
     <Columns> 
      <asp:BoundField DataField="media_id" Visible="false" HeaderText="" /> 
      <asp:BoundField DataField="dir_path" Visible="false" HeaderText="Dir" /> 
      <asp:TemplateField HeaderText="Date Taken" > 
       <ItemTemplate> 
        <asp:LinkButton ID="dateLinkCsBtn" OnClientClick='<%#Eval("dir_path","Javascript:return test(\"{0}\",event);")%>' 
         runat="server" Text='<%# Bind("date") %>'></asp:LinkButton> 
       </ItemTemplate> 
      </asp:TemplateField> 
      <asp:TemplateField HeaderText="Media Type"> 
       <ItemTemplate> 
        <asp:Label runat="server" ID="mediaTypeLbl" Text='<%#Eval("description") %>'></asp:Label> 
       </ItemTemplate> 
      </asp:TemplateField> 
      <asp:TemplateField HeaderText="Alias File Name"> 
       <ItemTemplate> 
        <asp:Label runat="server" ID="aliasFileName" Text='<%#Bind("alias_file_name") %>'></asp:Label> 
       </ItemTemplate> 
       <EditItemTemplate> 
        <asp:TextBox runat="server" Text='<%#Bind("alias_file_name") %>' ID="updateAliasTxt"></asp:TextBox> 
       </EditItemTemplate> 
      </asp:TemplateField> 
      <asp:CommandField ShowEditButton="True" /> 
     </Columns> 
    </asp:GridView> 
    </ContentTemplate></asp:UpdatePanel> 

後面的代碼:

protected void Page_Load(object sender, EventArgs e) 
{ 

    if (!IsPostBack) 
    { 
     FillGrid(); 
    } 

} 

protected void searchGV_RowEditing(object sender, GridViewEditEventArgs e) 
{ 
    searchGV.EditIndex = e.NewEditIndex; 
    FillGrid(); 
} 
protected void searchGV_RowCancelingEdit(object sender, 
          GridViewCancelEditEventArgs e) 
{ 
    searchGV.EditIndex = -1; 
    FillGrid(); 
} 

public void FillGrid() 
{ 
    Media_DAO media_query = new Media_DAO(); 
    searchGV.DataSource = media_query.get_search_media(alias_file_name_txt.Text.Trim(), Convert.ToInt16(mediaTypeDDL.SelectedValue), 
      from_date_txt.Text.Trim(), to_date_txt.Text.Trim(), Convert.ToInt16(Session["user_id"])); 
    searchGV.DataBind(); 
} 

protected void searchGV_RowUpdating(object sender, GridViewUpdateEventArgs e) 
{ 

    GridViewRow row = searchGV.Rows[e.RowIndex]; 
    TextBox new_alias = (TextBox)searchGV.Rows[e.RowIndex].FindControl("updateAliasTxt"); 
    int media_id = Convert.ToInt16(searchGV.DataKeys[e.RowIndex]["media_id"]); 

    Media_DAO media_query2 = new Media_DAO(); 
    media_query2.update_alias_name_by_id(media_id, new_alias.Text.Trim(), Convert.ToInt16(Session["user_id"])); 
    searchGV.EditIndex = -1; 
    FillGrid(); 
} 

回答

1

,同時宣佈已指定只 * 數據鍵值 *

asDataKeyNames="media_id" 

DateKeys網格網格視圖是sto紅色以從0開始的陣列格式。 錯誤可能是在更新時獲取media_id。你需要改變它如下。

protected void searchGV_RowUpdating(object sender, GridViewUpdateEventArgs e) 
{ 

    GridViewRow row = searchGV.Rows[e.RowIndex]; 
    TextBox new_alias = (TextBox)searchGV.Rows[e.RowIndex].FindControl("updateAliasTxt"); 
    int media_id = Convert.ToInt16(e.Keys[0]); //this will get the media_id 

    Media_DAO media_query2 = new Media_DAO(); 
    media_query2.update_alias_name_by_id(media_id, new_alias.Text.Trim(), Convert.ToInt16(Session["user_id"])); 
    searchGV.EditIndex = -1; 
    FillGrid(); 
} 

由於早期的方法是searchGV.DataKeys[e.RowIndex]["media_id"],你可能無法得到的media_id值,如果您正在嘗試編輯的行數大於1

1

的GridView的DataKeys屬性返回DataKey集合表示GridView每行的數據鍵值的對象。因此,DataKeys[1]給第二排,DataKeys[4]給第5行......

因此,你需要使用任一ValueValues屬性來訪問一個關鍵字段的值。

不是這樣:

int media_id = Convert.ToInt16(searchGV.DataKeys[e.RowIndex]["media_id"]); 

做到這一點:

int media_id = Convert.ToInt16(searchGV.DataKeys[e.RowIndex].Values["media_id"]); 
// You can also use the Value property which gives the key value at index 0 
int media_id = Convert.ToInt16(searchGV.DataKeys[e.RowIndex].Value);