2011-12-08 6 views
0

DBの値を更新するためのrowcommandを実行するgridviewがあります。更新を実行した後、gridviewはテーブルの最新の値で更新されません。私はこの問題を解決するための多くのソリューションを見てきました。それらのほとんどは単に「単にgridviewを再バインドしてください」データソースIDの使用中に最新の値を取得するためにgridviewをリフレッシュする

私はgridviewのバインディングを実行しようとしましたが、グリッドビューをリフレッシュすることはありません。私も最初そうのようなテーブルを作成するときに使用のObjectDataSourceにデータソースを再割り当てしようとした

GridViewHolder.DataSource = MachineDataSet; 
GridViewHolder.DataBind(); 

はしかし、私が言ってエラーになってしまった:データソースとdatasourceidの両方が宣言されていることと、 1つの定義を削除します。

誰かが私のグリッドビューで何が間違っているのか教えていただけたら大いに感謝しますか?

以下は、rowcommandのmyviewとcodebehindです。

Gridview:注:読みやすいようにすべての不要なコンテキストを削除しました。詳細が必要な場合は、gridviewのコード全体をスローします。

<asp:GridView ID="GridViewHolder" 
         runat="server" 
         AllowPaging="True" 
         AutoGenerateColumns="False"                    
         EnableViewState="False" 
         DataKeyNames="ID"       
         OnRowCommand="GridViewHolder_RowCommand" 
         DataSourceID="MachineDataSet"> 
      <RowStyle BackColor="Transparent" 
         HorizontalAlign="Center" /> 
      <Columns>      
       <asp:ButtonField ButtonType="Button" Text="Assign New Values" 
           CommandName="AssignNewValue" ItemStyle-Wrap="true" 
           ItemStyle-Width="25px"> 
        <ItemStyle Width="25px" Wrap="True" /> 
       </asp:ButtonField> 
      </Columns> 
    </asp:GridView> 

分離コード:

/// <summary> 
    /// Handles the rowcommand event button 
    /// </summary> 
    /// <param name="sender">The source control event</param> 
    /// <param name="e">The <see cref="System.Web.UI.WebControls.GridViewCommandEventArgs"/> instance containing the even data.</param> 
    protected void GridViewHolder_RowCommand(object sender, GridViewCommandEventArgs e) 
    { 
     logger.Debug("Entering Row Command"); 
     if (e.CommandName.CompareTo("AssignNewValue") == 0) 
     { 
      try 
      { 

       logger.Debug("Entering AssignNewValue Command"); 
       int index = Convert.ToInt32(e.CommandArgument); 
       GridView gv = (GridView)Panel1.FindControl("GridViewHolder"); 
       GridViewRow row = gv.Rows[index]; 
       Label machineID = (Label)row.FindControl("MachineIDLabel"); 
       int machineid = Convert.ToInt32(machineID.Text); 
       string machinetypeid = MachineTypeComboBox.SelectedValue; 
       string machinemodelid = MachineModelComboBox.SelectedValue; 
       try 
       { 
        if (machinetypeid != "" || machinemodelid != "") 
        { 
         if (machinetypeid != "") 
         { 
          inputsService.UpdateMachineTypes(machineid, machinetypeid); 
         } 
         if (machinemodelid != "") 
         { 
          inputsService.UpdateMachineModels(machineid, machinemodelid); 
         } 

         UpdateSucceed.Visible = true; 
         logger.Debug("AssignNewValue - Database successfully updated!"); 
        } 
        else 
        { 
         UpdateFail.Visible = true; 
         logger.Debug("AssignNewValue - Database had no data selected to be updated."); 
        }       
       } 
       catch (Exception ex) 
       { 
        logger.ErrorFormat("AssignNewValue - Failed to update the table, ex = {0}", ex); 
       } 

      } 
      catch (Exception ex) 
      { 
       logger.ErrorFormat("AssignNewValue Failed to complete, {0}", ex); 
      } 

      logger.Debug("Leaving AssignNewValue Command"); 
     } 
     logger.Debug("Leaving Row Command"); 
    } 

データソースコード:

<asp:ObjectDataSource ID="MachineDataSet" 
           runat="server" 
           SelectMethod="GetMachineSiteDetails"               
           TypeName="Datamart.UI.Reporting.Web.FilteredReportInputsSvc.FilteredReportInputsService" 
           EnableCaching="True"> 
      <SelectParameters> 
       <asp:Parameter DefaultValue="" Name="siteid" Type="String" /> 
      </SelectParameters> 
     </asp:ObjectDataSource> 

任意のヘルプや提案が非常に高く評価されています。

GridView gv = (GridView)Panel1.FindControl("GridViewHolder") 
GridViewHolder.DataSource = MachineDataSet; 
GridViewHolder.DataBind(); 
UpdateSucceed.Visible = true; 

それがあるべきとき::私はあなたのコードでこれを持って見

おかげ

+1

"しかし、私は最終的に次のようなエラーが出ることになります:データソースとデータソースの両方が宣言され、定義を削除するということです。私が思い出すことから、どちらか一方を使用する必要があります。あなたのコードビハインドでは、おそらくちょうど.Databind()コールを行うことで逃げることができます – user1231231412

+0

@jonc私はエラーをスローしない.databind()コールもやってみましたが、後でgridviewをリフレッシュしません更新情報 – James213

+0

DataSource定義コードを投稿できますか?MachineDataSetの場合 – user1231231412

答えて

2

GridView gv = (GridView)Panel1.FindControl("GridViewHolder") 
gv.DataSource = MachineDataSet; 
gv.DataBind(); 
UpdateSucceed.Visible = true; 

はしかし、私は機能でこれを持っており、それを呼ぶだろうpage_loadイベントもrow_commandにあります。しかし、あなたは、GridViewのの定義にそれを持っていなければならない:ページにデータソースコントロールを持っている場合にのみ、

DataSourceID="MachineDataSet"> 

DataSourceIDを使用する必要があります。

編集:グリッドビューでコードページからグリッドビューをバインドする場合は、コード内で、グリッドビューでページング/並べ替えを実行できるように調整する必要があります。あなたがそれについての助けを必要とするならば、あなたは単純な検索をする必要があり、それは確かにそれを見つけるでしょう。 幸運を祈る!

+0

を追加しました。このようなページがある場合はdatasourceidのみを使用してください: – James213

+0

データソースを表すコントロールのIDを指定するためにDataSourceIDを使用してくださいデータバインドされたコントロールはそのデータを取得します。 http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.databoundcontrol.datasourceid.aspx –

+0

ええ@ James213、あなたのデータソースコントロール(ObjectDataSource MachineDataSet)はうまく見えますが、 DataSourceIDまたはDataSourceは両方ではありません。 –

関連する問題