2012-03-07 15 views
0

ASP.NET GridViewバインディングの仕組みと全く混同しています。ASP.NETのGridViewとのバインディングの問題

私はGridViewです。今、ページロード(!IsPostBackを使用して)私はGridViewを拘束しています。

私のgridviewには編集ボタンがあります。私がそれをクリックすると、GridViewは空白になります。私が編集ボタンをクリックすると、ポストバックが発生し、!IsPostbackの条件の中にGridViewをバインドしたので、GridViewをバインドしないので、動作が期待できます。

今、GridViewバインディングを削除して!IsPostbackの外に置くと、編集ボタンが機能します。しかし、編集した値はTextBoxから取得できません。この場合も、更新ボタンがクリックされたときに、!IsPostbackの条件の外でバインドが行われたため、GridViewが再バインドされるため、動作が期待できます。

編集ボタンが正しく動作するコードは何かを知りたいと同時に、TextBoxの編集値を取得することができます。コードを更新しました

質問:以下

<asp:GridView ID="grdExternalLinkSection1" ShowFooter="true" runat="server" Width="100%" AutoGenerateColumns="false" CellPadding="5" EnableViewState="true"> 
           <EmptyDataTemplate> 
            External Link Title 
            <asp:TextBox ID="txtExternalLinkTitleEmptySection1" runat="server"></asp:TextBox> 
            External Link Url 
            <asp:TextBox ID="txtExternalLinkUrlEmptySection1" runat="server"></asp:TextBox> 
            <asp:Button ID="btnExternalLinkEmptySection1" OnCommand="grdExternalLinkSection_Button_Clicks" runat="server" Text="Add" CommandName="headernew,1" style="padding:3px; width:56px;" /> 
           </EmptyDataTemplate> 
           <Columns> 
            <asp:TemplateField HeaderText="Title"> 
             <ItemTemplate> 
              <asp:Label ID="lblExternalLinkTitleSection1" runat="server"><%# Eval("Title") %></asp:Label> 
             </ItemTemplate> 
             <EditItemTemplate> 
              <asp:TextBox ID="txtExternalLinkTitleEditSection1" runat="server" Text='<%# Bind("Title") %>'></asp:TextBox> 
             </EditItemTemplate> 
             <FooterTemplate> 
              <asp:TextBox ID="txtExternalLinkTitleFooterSection1" runat="server"></asp:TextBox> 
             </FooterTemplate> 
            </asp:TemplateField> 
            <asp:TemplateField HeaderText="Url"> 
             <ItemTemplate> 
              <asp:Label ID="lblExternalLinkUrlSection1" runat="server"><%# Eval("Url")%></asp:Label> 
             </ItemTemplate> 
             <EditItemTemplate> 
              <asp:TextBox ID="txtExternalLinkUrlEditSection1" runat="server" Text='<%# Bind("Url") %>'></asp:TextBox> 
             </EditItemTemplate> 
             <FooterTemplate> 
              <asp:TextBox ID="txtExternalLinkUrlFooterSection1" runat="server"></asp:TextBox> 
             </FooterTemplate> 
            </asp:TemplateField> 

            <asp:TemplateField HeaderText="Manage"> 
             <ItemTemplate> 
              <asp:Button ID="btnExternalLinkEditSection1" OnCommand="grdExternalLinkSection_Button_Clicks" runat="server" CommandName="Editing,1" CommandArgument='<%# Container.DataItemIndex %>' Text="Edit" /> 
              <asp:Button ID="btnExternalLinkDeleteSection1" OnCommand="grdExternalLinkSection_Button_Clicks" runat="server" CommandName="Deleting,1" CommandArgument='<%# Container.DataItemIndex %>' Text="Delete" /> 
             </ItemTemplate> 
             <EditItemTemplate> 
              <asp:Button ID="btnExternalLinkUpdateSection1" OnCommand="grdExternalLinkSection_Button_Clicks" runat="server" CommandName="Updating,1" CommandArgument='<%# Container.DataItemIndex %>' Text="Update" /> 
              <asp:Button ID="btnExternalLinkCancelSection1" OnCommand="grdExternalLinkSection_Button_Clicks" runat="server" CommandName="Canceling,1" CommandArgument='<%# Container.DataItemIndex %>' Text="Cancel" /> 
             </EditItemTemplate> 
             <FooterTemplate> 
              <asp:Button ID="btnExternalLinkAddFooterSection1" OnCommand="grdExternalLinkSection_Button_Clicks" runat="server" CommandName="Footer,1" Text="Add" /> 
             </FooterTemplate> 
            </asp:TemplateField> 
           </Columns> 
          </asp:GridView> 

結合作業を行う機能である:

以下
GridView grid; 
    protected void BindExternalLinks(int SectionID, string ControlName) 
    { 
     using (SqlConnection connection = new SqlConnection(connectionString)) 
     { 
      using (SqlDataAdapter adapter = new SqlDataAdapter("user_Newsletter_GetExternalLinks", connection)) 
      { 
       adapter.SelectCommand.CommandType = CommandType.StoredProcedure; 
       adapter.SelectCommand.Parameters.Add("@SectionID", SqlDbType.Int).Value = SectionID; 
       adapter.SelectCommand.Parameters.Add("@PortalID", SqlDbType.Int).Value = PortalID; 
       DataTable dt = new DataTable(); 
       adapter.Fill(dt); 
       grid = (GridView)this.FindControl(ControlName); 
       grid.DataSource = dt; 
      } 
     } 
    } 
    protected void BindAllExternalLinks() 
    { 
     for (int i = 1; i <= NewsLetterSectionCount; i++) 
     { 
      BindExternalLinks(i, "grdExternalLinkSection" + i); 
      grid.DataBind(); 
     } 
    } 

は私のPageLoadです:

protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!IsPostBack) 
     { 
      BindAllExternalLinks(); 
     } 
    } 

以下は私のコマンドですボタンイベント:私はすべてのコマンドボタンのハンドラーを共通にしておきました:

protected void grdExternalLinkSection_Button_Clicks(object sender, CommandEventArgs e) 
    { 
     int rowIndex = (e.CommandArgument != "") ? Convert.ToInt32(e.CommandArgument) : -1; 
     string[] commandNames = e.CommandName.ToString().Split(','); 
     string command = commandNames[0].ToString().ToLower(); 
     int sectionID = Convert.ToInt32(commandNames[1]); 
     GridView grid = (GridView)this.FindControl("grdExternalLinkSection" + sectionID); 
     try 
     { 
      if (command == "headernew") 
      { 
       TextBox title = grid.Controls[0].Controls[0].FindControl("txtExternalLinkTitleEmptySection" + sectionID) as TextBox; 
       TextBox url = grid.Controls[0].Controls[0].FindControl("txtExternalLinkUrlEmptySection" + sectionID) as TextBox; 
       UpdateExternalLinks(ModifyExternalLinks.Insert, sectionID, title.Text, url.Text); 
       MessageShow("External Link Added Successfully"); 
      } 
      else if (command == "editing") 
      { 
       //grid.EditIndex = rowIndex; 
      } 
      else if (command == "canceling") 
      { 
       grid.EditIndex = -1; 
      } 
      else if (command == "footer") 
      { 
       Response.Write("Inside Footer"); 
      } 
     } 
     catch (Exception ex) 
     { 
      Response.Write(ex.ToString()); 
     } 
     BindExternalLinks(sectionID, "grdExternalLinkSection" + sectionID); 
     grid.DataBind(); //here i am binding once the records are modified. 
    } 
+0

のようなすべてのポストバック要求の後にDataBindメソッドを呼び出す必要があり、彼らが読みそれほど難しくないように、段落の中にあなたの記事を分割してください。また、可能な場合は、正しい大文字と句読点を使用してください。 – jadarnel27

+0

GridView aspxのマークアップを教えてください。何が_blank_を意味し、ViewStateが有効になっていますか? –

+0

あなたはGridView全体を表示していない、CommandName = "編集"のボタンがない。そして、どこから 'BindExternalLinks'が呼び出されますか? –

答えて

1

あなたはほぼあります。 BindAllExternalLinks()if (!IsPostback)ブロック内にある必要があります。

else if (command == "editing") 
{ 
    // do your update stuff here 

    BindAllExternalLinks(); 
} 
0

ちょうど各ポストバックイベントの下のGridViewを再バインド():あなたがすべき

追加の事は、あなたの編集を行っている後にグリッドを再バインドすることです。あなたは、オブジェクトデータソースまたはSQLのデータソースにバインドしている場合でも、あなたは

   MyGridview.DataBind(); 
       UpdatePanel1.Update();