2010-01-08 3 views
0

UpdatePanel 내에 데이터 바인딩 된 격자보기가 있습니다.TextBox TextChanged 이벤트 및 CheckBoc CheckedChanged 이벤트가 Gridview 내에서 실행되지 않습니다.

아이디어는 사용자가 그리드 뷰 내에서 데이터를 변경 한 다음 저장 버튼을 클릭하여 데이터베이스 내의 데이터를 업데이트 할 수 있다는 것입니다.

그러나 어떤 행이 변경되었는지 알기 위해 각 텍스트 상자와 연결된 textChanged 이벤트가 있지만 이벤트가 발생하지 않습니다.

다음은 ASP 코드입니다 :

<asp:UpdatePanel ID="UpdatePanel1" runat="server"> 
<ContentTemplate> 
    <span>To update your poducts simply change the details below and click Save...</span> 
    <div class="ProductList"> 
     <asp:GridView ID="ProductList" runat="server" AllowPaging="True" AutoGenerateColumns="False" 
      BackColor="#FFFBD6" BorderColor="#FFCC66" BorderStyle="None" BorderWidth="1px" 
      CellPadding="3" OnPageIndexChanged="ProductList_PageIndexChanged" OnPageIndexChanging="ProductList_PageIndexChanging" 
      PagerSettings-Mode="NumericFirstLast" PageSize="5"> 
      <FooterStyle BackColor="White" ForeColor="#990000" /> 
      <Columns> 
       <asp:TemplateField HeaderText="Name"> 
        <ItemTemplate> 
         <asp:TextBox ID="tbName" AutoPostBack="true" EnableViewState="true" runat="server" BorderStyle="None" OnTextChanged="TextBox_TextChanged" 
          Text='<%# Bind("productName") %>'></asp:TextBox> 
         <asp:HiddenField ID="HiddenField1" runat="server" Value='<%# Eval("productID") %>' /> 
        </ItemTemplate> 
       </asp:TemplateField> 
       <asp:TemplateField HeaderText="Description"> 
        <ItemTemplate> 
         <asp:TextBox ID="tbDesc" AutoPostBack="true" EnableViewState="true" runat="server" BorderStyle="None" OnTextChanged="TextBox_TextChanged" 
          Text='<%# Bind("productDesc") %>' TextMode="MultiLine"></asp:TextBox> 
        </ItemTemplate> 
       </asp:TemplateField> 
       <asp:TemplateField HeaderText="Price"> 
        <ItemTemplate> 
         <asp:TextBox ID="tbPrice" AutoPostBack="true" EnableViewState="true" runat="server" BorderStyle="None" OnTextChanged="TextBox_TextChanged" 
          Text='<%# Bind("productPrice", "{0:C}") %>'></asp:TextBox> 
        </ItemTemplate> 
       </asp:TemplateField> 
       <asp:TemplateField HeaderText="Select"> 
        <ItemTemplate> 
         <asp:CheckBox id="cbDelete" AutoPostBack="true" EnableViewState="true" runat="server" /> 
        </ItemTemplate> 
       </asp:TemplateField> 
      </Columns> 
      <RowStyle ForeColor="#000066" /> 
      <SelectedRowStyle BackColor="#669999" Font-Bold="True" ForeColor="White" /> 
      <PagerStyle BackColor="beige" ForeColor="#000066" HorizontalAlign="Left" /> 
      <HeaderStyle BackColor="#990000" Font-Bold="True" ForeColor="White" /> 
     </asp:GridView> 
    </div> 
    <div class="ProductListButtons"> 
     <asp:ImageButton AlternateText="Add" ToolTip="Add New Product" Width="30px" Height="30px" 
      ImageUrl="~/Images/Add.png" ID="AddBtn" runat="server" OnClick="AddBtn_Click" /> 
     <asp:ImageButton ID="DeleteBtn" runat="server" AlternateText="Delete" Height="30px" 
      ImageUrl="~/Images/delete.png" ToolTip="Delete Selected" Width="30px" OnClick="DeleteBtn_Click" /> 
     <asp:ImageButton AlternateText="Save Changes" ToolTip="Save Changes" Width="30px" 
      Height="30px" ImageUrl="~/Images/save-icon.png" ID="SaveBtn" runat="server" OnClick="SaveBtn_Click" /> 

    </div> 
</ContentTemplate> 
<Triggers> 
    <asp:AsyncPostBackTrigger ControlID="ProductList" EventName="PageIndexChanged" /> 
    <asp:AsyncPostBackTrigger ControlID="DeleteBtn" EventName="Click" /> 
</Triggers> 

그리고 여기에 C 번호입니다 : 무거운

using System; 
using System.Data; 
using BusinessLogicLayer; 
using DataAccessLayer.Objects; 
using System.Web.UI.WebControls; 

public partial class Controls_ProductList : System.Web.UI.UserControl 
{ 
public int StallID { get; set; } 
bool[] rowChanged; 
bool[] rowDeleted; 

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (IsPostBack) 
    { 
     StallID = Convert.ToInt16(ViewState["StallID"].ToString()); 
    } 
    int totalRows = ProductList.Rows.Count; 
    rowChanged = new bool[totalRows]; 
    rowDeleted = new bool[totalRows]; 
    BindList(); 
    ViewState.Add("StallID", StallID); 
} 

public void BindList() 
{ 
    StallHandler handler = new StallHandler(); 
    DataTable productList = handler.GetProductsByID(StallID); 
    ProductList.DataSource = productList; 
    ProductList.DataBind(); 
} 

protected void TextBox_TextChanged(object sender, EventArgs e) 
{ 
    TextBox thisTextBox = (TextBox)sender; 
    GridViewRow thisGridViewRow = (GridViewRow)thisTextBox.Parent.Parent; 
    int row = thisGridViewRow.RowIndex; 
    rowChanged[row] = true; 
} 

protected void cbDelete_CheckedChanged(object sender, EventArgs e) 
{ 
    CheckBox thisCheckbox = (CheckBox)sender; 
    GridViewRow thisGridViewRow = (GridViewRow)thisCheckbox.Parent.Parent; 
    int row = thisGridViewRow.RowIndex; 
    rowDeleted[row] = true; 
} 

protected void Page_PreRender(object sender, EventArgs e) 
{ 
    if (Page.IsPostBack) 
    { 
     ProductList.DataBind(); 
    } 
} 

protected void ProductList_PageIndexChanged(object sender, EventArgs e) 
{ 
} 

protected void ProductList_PageIndexChanging(object sender, GridViewPageEventArgs e) 
{ 
    ProductList.PageIndex = e.NewPageIndex; 
    ProductList.DataBind(); 
} 

protected void AddBtn_Click(object sender, System.Web.UI.ImageClickEventArgs e) 
{ 
    Response.Redirect("../StallHolder/AddProduct.aspx"); 
} 

protected void DeleteBtn_Click(object sender, System.Web.UI.ImageClickEventArgs e) 
{ 
    int totalRows = ProductList.Rows.Count; 
    for (int r = 0; r < totalRows; r++) 
    { 
     if (rowDeleted[r]) 
     { 
      GridViewRow thisGridViewRow = ProductList.Rows[r]; 
      HiddenField hf1 = (HiddenField)thisGridViewRow.FindControl("HiddenField1"); 
      string ID = hf1.Value; 
      StallHandler handler = new StallHandler(); 
      handler.DeleteProduct(Convert.ToInt16(ID)); 
     } 
    }  
    BindList(); 
} 

protected void SaveBtn_Click(object sender, System.Web.UI.ImageClickEventArgs e) 
{ 
    int totalRows = ProductList.Rows.Count; 
    for (int r = 0; r < totalRows; r++) 
    { 
     if (rowChanged[r]) 
     { 
      GridViewRow thisGridViewRow = ProductList.Rows[r]; 
      HiddenField hf1 = (HiddenField)thisGridViewRow.FindControl("HiddenField1"); 
      string ID = hf1.Value; 
      TextBox tbName = (TextBox)thisGridViewRow.FindControl("tbName"); 
      string Name = tbName.Text; 
      TextBox tbDesc = (TextBox)thisGridViewRow.FindControl("tbDesc"); 
      string Desc = tbDesc.Text; 
      TextBox tbPrice = (TextBox)thisGridViewRow.FindControl("tbPrice"); 
      string Price = tbPrice.Text; 
      //Code to update the database! 
     } 
    } 
} 

}

죄송합니다 그게 전부 꽤 코드를하지만 난 '무슨 생각이 없다 나는 잘못하고있다.

+0

미안하지만 편집 가능한 gridview는이 자습서 http://www.wherecanibuyit.co.uk/ASP/fully_editable_gridview.html에서 가져 왔지만, 업데이트 패널 내에서 사용하지는 않습니다. – Morgeh

+0

그래서 일부 체크 박스를 체크하면 , Add 버튼을 누르면'AddBtn_Click' 전에'cbDelete_CheckedChanged'가 호출되지 않습니다. 모두 괜찮은 것 같아요. 샘플 프로젝트를 만들고 테스트 해 보겠습니다. – Codesleuth

+0

체크 박스가없는 아이디어는 제품을 선택한 다음 DeleteBtn을 클릭하여 삭제할 수 있다는 것입니다. 그러나 확인란을 클릭 할 때마다 Checkbox_CheckedChanged 이벤트가 실행되지 않으므로 삭제하려는 제품이 기록되지 않습니다. – Morgeh

답변

1

좋아,이 작업을 수행 할 때 발견 한 몇 가지 사항이 있습니다.

<asp:UpdatePanel ID="UpdatePanel1" runat="server"> 
    <ContentTemplate> 
     <span>To update your poducts simply change the details below and click Save...</span> 
     <div class="ProductList"> 
      <asp:GridView ID="ProductList" runat="server" AllowPaging="True" AutoGenerateColumns="False" 
       BackColor="#FFFBD6" BorderColor="#FFCC66" BorderStyle="None" BorderWidth="1px" 
       CellPadding="3" OnPageIndexChanged="ProductList_PageIndexChanged" OnPageIndexChanging="ProductList_PageIndexChanging" 
       PagerSettings-Mode="NumericFirstLast" PageSize="5"> 
       <FooterStyle BackColor="White" ForeColor="#990000" /> 
       <Columns> 
        <asp:TemplateField HeaderText="Name"> 
         <ItemTemplate> 
          <asp:TextBox ID="tbName" AutoPostBack="false" EnableViewState="true" runat="server" BorderStyle="None" OnTextChanged="TextBox_TextChanged" 
           Text='<%# Bind("productName") %>'></asp:TextBox> 
          <asp:HiddenField ID="HiddenField1" runat="server" Value='<%# Eval("productID") %>' /> 
         </ItemTemplate> 
        </asp:TemplateField> 
        <asp:TemplateField HeaderText="Description"> 
         <ItemTemplate> 
          <asp:TextBox ID="tbDesc" AutoPostBack="false" EnableViewState="true" runat="server" BorderStyle="None" OnTextChanged="TextBox_TextChanged" 
           Text='<%# Bind("productDesc") %>' TextMode="MultiLine"></asp:TextBox> 
         </ItemTemplate> 
        </asp:TemplateField> 
        <asp:TemplateField HeaderText="Price"> 
         <ItemTemplate> 
          <asp:TextBox ID="tbPrice" AutoPostBack="false" EnableViewState="true" runat="server" BorderStyle="None" OnTextChanged="TextBox_TextChanged" 
           Text='<%# Bind("productPrice", "{0:C}") %>'></asp:TextBox> 
         </ItemTemplate> 
        </asp:TemplateField> 
        <asp:TemplateField HeaderText="Select"> 
         <ItemTemplate> 
          <asp:CheckBox id="cbDelete" OnCheckedChanged="cbDelete_CheckedChanged" AutoPostBack="false" EnableViewState="true" runat="server" /> 
         </ItemTemplate> 
        </asp:TemplateField> 
       </Columns> 
       <RowStyle ForeColor="#000066" /> 
       <SelectedRowStyle BackColor="#669999" Font-Bold="True" ForeColor="White" /> 
       <PagerStyle BackColor="beige" ForeColor="#000066" HorizontalAlign="Left" /> 
       <HeaderStyle BackColor="#990000" Font-Bold="True" ForeColor="White" /> 
      </asp:GridView> 
     </div> 
     <div class="ProductListButtons"> 
      <asp:ImageButton AlternateText="Add" ToolTip="Add New Product" Width="30px" Height="30px" 
       ImageUrl="~/Images/Add.png" ID="AddBtn" runat="server" OnClick="AddBtn_Click" /> 
      <asp:ImageButton ID="DeleteBtn" runat="server" AlternateText="Delete" Height="30px" 
       ImageUrl="~/Images/delete.png" ToolTip="Delete Selected" Width="30px" OnClick="DeleteBtn_Click" /> 
      <asp:ImageButton AlternateText="Save Changes" ToolTip="Save Changes" Width="30px" 
       Height="30px" ImageUrl="~/Images/save-icon.png" ID="SaveBtn" runat="server" OnClick="SaveBtn_Click" /> 

     </div> 
    </ContentTemplate> 
</asp:UpdatePanel> 

그리고 코드 숨김 :

public partial class Controls_ProductList : System.Web.UI.UserControl 
{ 
    public int StallID { get; set; } 
    bool[] rowChanged; 
    bool[] rowDeleted; 

    // this allows me to test your code without your data source (C# 3.0 list constructor) 
    private static List<Product> _productList = new List<Product>() { 
      new Product() { productID = 1, productName = "Product 1", productDesc = "This is product 1", productPrice = 1.0m }, 
      new Product() { productID = 2, productName = "Product 2", productDesc = "This is product 2", productPrice = 1.0m }, 
      new Product() { productID = 3, productName = "Product 3", productDesc = "This is product 3", productPrice = 1.0m } 
     }; 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (IsPostBack) 
     { 
      StallID = Convert.ToInt16(ViewState["StallID"].ToString()); 
     } 
     else 
     { 
      // Only bind if this is not a postback 
      BindList(); 
     } 

     int totalRows = ProductList.Rows.Count; 
     rowChanged = new bool[totalRows]; 
     rowDeleted = new bool[totalRows]; 

     ViewState.Add("StallID", StallID); 

     foreach (GridViewRow row in ProductList.Rows) 
     { 
      var checkBox = row.FindControl("cbDelete"); 
      ScriptManager1.RegisterAsyncPostBackControl(checkBox); 
     } 
    } 

    public void BindList() 
    { 
     //StallHandler handler = new StallHandler(); 
     //DataTable productList = handler.GetProductsByID(StallID); 
     ProductList.DataSource = _productList; 
     ProductList.DataBind(); 
    } 

    protected void TextBox_TextChanged(object sender, EventArgs e) 
    { 
     TextBox thisTextBox = (TextBox)sender; 
     GridViewRow thisGridViewRow = (GridViewRow)thisTextBox.Parent.Parent; 
     int row = thisGridViewRow.RowIndex; 
     rowChanged[row] = true; 
    } 

    protected void cbDelete_CheckedChanged(object sender, EventArgs e) 
    { 
     CheckBox thisCheckbox = (CheckBox)sender; 
     GridViewRow thisGridViewRow = (GridViewRow)thisCheckbox.Parent.Parent; 
     int row = thisGridViewRow.RowIndex; 
     rowDeleted[row] = true; 
    } 

    protected void Page_PreRender(object sender, EventArgs e) 
    { 
     //if (Page.IsPostBack) 
     //{ 
     // ProductList.DataBind(); 
     //} 
    } 

    protected void ProductList_PageIndexChanged(object sender, EventArgs e) 
    { 

    } 

    protected void ProductList_PageIndexChanging(object sender, GridViewPageEventArgs e) 
    { 
     ProductList.PageIndex = e.NewPageIndex; 
     ProductList.DataBind(); 
    } 

    protected void AddBtn_Click(object sender, System.Web.UI.ImageClickEventArgs e) 
    { 
     Response.Redirect("../StallHolder/AddProduct.aspx"); 
    } 

    protected void DeleteBtn_Click(object sender, System.Web.UI.ImageClickEventArgs e) 
    { 
     int totalRows = ProductList.Rows.Count; 
     for (int r = 0; r < totalRows; r++) 
     { 
      if (rowDeleted[r]) 
      { 
       GridViewRow thisGridViewRow = ProductList.Rows[r]; 
       HiddenField hf1 = (HiddenField)thisGridViewRow.FindControl("HiddenField1"); 
       int ID = Convert.ToInt16(hf1.Value); 
       //StallHandler handler = new StallHandler(); 
       //handler.DeleteProduct(Convert.ToInt16(ID)); 

       _productList = _productList.Where(a => a.productID != ID).ToList(); 
      } 
     } 
     BindList(); 
    } 

    protected void SaveBtn_Click(object sender, System.Web.UI.ImageClickEventArgs e) 
    { 
     int totalRows = ProductList.Rows.Count; 
     for (int r = 0; r < totalRows; r++) 
     { 
      if (rowChanged[r]) 
      { 
       GridViewRow thisGridViewRow = ProductList.Rows[r]; 
       HiddenField hf1 = (HiddenField)thisGridViewRow.FindControl("HiddenField1"); 
       int ID = Convert.ToInt32(hf1.Value); 
       TextBox tbName = (TextBox)thisGridViewRow.FindControl("tbName"); 
       string Name = tbName.Text; 
       TextBox tbDesc = (TextBox)thisGridViewRow.FindControl("tbDesc"); 
       string Desc = tbDesc.Text; 
       TextBox tbPrice = (TextBox)thisGridViewRow.FindControl("tbPrice"); 
       string Price = tbPrice.Text; 
       //Code to update the database! 

       var product = _productList.Where(a => a.productID == ID).First(); 
       product.productName = Name; 
       product.productDesc = Desc; 
       product.productPrice = decimal.Parse(Price, System.Globalization.NumberStyles.Currency); 
      } 
     } 
     BindList(); 
    } 
} 

public class Product 
{ 
    public int productID { get; set; } 
    public string productName { get; set; } 
    public string productDesc { get; set; } 
    public decimal productPrice { get; set; } 
} 

내가 이것을 테스트하기 위해 데이터 소스로 사용하는 내 자신의 클래스를 작성했던 코드를 살펴이

ASP를 니펫 있습니다. 솔루션에 해당하는 코드 만 제거하면됩니다. 체크 박스와 텍스트 박스

  1. 설정 AutoPostback="False" :

    당신이 볼 수 있듯이

    , 나는 일부 변경했습니다.
  2. <Triggers> 요소를 제거했습니다. 이는 UpdatePanel 외부 컨트롤에만 적용됩니다.
  3. 확인란에 OnCheckedChanged="cbDelete_CheckedChanged" 요소를 추가했습니다.

일부 사소한 변경도 있지만 언급할만한 것이 없습니다. 나는 당신이 이것을 한 방식의 팬이 아니라는 것을 언급해야하지만 작동하는 것처럼 보입니다.

+0

더 좋은 방법이 있다고 생각한다면 제안을 할 수 있습니까? 도움을 주셔서 감사합니다. 변경 사항을 구현하고 어떻게 진행되는지 알려 드리겠습니다. – Morgeh

+0

도움을 주셔서 감사 드리며 제안 된 변경 사항을 적용했으며 체크 박스 삭제 기능이 완벽하게 작동합니다. 동일한 기능이 Gridview 내의 텍스트 변경 내용을 저장하는 데 유용합니다. – Morgeh

+0

문제 없습니다. 텍스트를 편집 할 때 붙여 넣은 코드를 테스트 한 결과 데이터 소스에 적용된 변경 사항이 적용되었습니다. – Codesleuth

관련 문제