2008-12-18 82 views
1

我有一個帶有複選框的TemplateField的GridView。我的目標是使用autopostback捕獲onclick事件並設置數據庫標誌。我唯一的問題是事件發生了兩次。第一次複選框(在發件人參數中)保存點擊值,因此我根據點擊進行設置。發件人參數第二次有複選框,始終checked = false。我很樂意接受其他解決此問題的建議,但我的目標是根據用戶選中複選框來設置數據庫標誌。我的目標是.NET Framework 2.0。單擊複選框會導致onCheckedChanged觸發兩次

下面是相關的代碼:

<div style="margin-left : 1em;margin-right:1em;"> 
    <asp:GridView ID="RouteGridView" runat="server" AllowPaging="True" 
      AutoGenerateColumns="False" CellPadding="4" DataKeyNames="ROUTE_NUMBER" 
      ForeColor="#333333" GridLines="None" style="width:100%;" 
     onselectedindexchanged="RouteGridView_SelectedIndexChanged" 
     AllowSorting="True" onpageindexchanging="RouteGridView_PageIndexChanging" 
     onsorting="RouteGridView_Sorting" > 
      <Columns> 
<%-- Column one --%> 
<asp:TemplateField HeaderText="Route" SortExpression="ROUTE_NUMBER"> 
    <ItemTemplate> 
     <asp:LinkButton ID="HyperLink1" runat="server" CommandName="Select" CommandArgument='<%#Eval("ROUTE_NUMBER")%>' 
          Text='<%# Eval("ROUTE_NUMBER") %>' ></asp:LinkButton> 
    </ItemTemplate> 
    <ItemStyle HorizontalAlign="Center" /> 
</asp:TemplateField> 

<%-- Column 2 this is where the problem CheckBox is--%> 
<asp:TemplateField HeaderText="Read?" 
    SortExpression="READ_FLAG"> 
    <ItemTemplate> 
     <asp:CheckBox ID="CheckBox1" runat="server" 
      OnCheckedChanged="ChangeReadFlag" 
      AutoPostBack="true" 
      Checked='<%# (string)DataBinder.Eval(Container.DataItem, "READ_FLAG") == "1" %>' Enabled='<%# isSelectedRow(Container) %>' /> 
    </ItemTemplate> 
    <ItemStyle HorizontalAlign="Center" /> 
</asp:TemplateField> 

<%-- more columns --% 
<%-- more columns --%> 
</Columns> 
</asp:GridView> 

下面是從後面的代碼事件處理程序:

protected void ChangeReadFlag(object sender, EventArgs e) 
{ 
    if (RouteGridView.SelectedIndex != -1) 
    { 
     CheckBox cb = ((CheckBox)sender); 
     DataKey key = RouteGridView.SelectedDataKey; 

     //... do stuff here ... 
    } 
} 
+0

您可能需要張貼更多代碼才能得到回覆 – 2008-12-18 22:43:11

+0

這可能是不相關的,但如果標籤沒有指定src,那麼瀏覽器中存在一個錯誤。那麼兩個請求都是 – 2008-12-18 22:48:19

回答

0

你想捕捉偶數的GridView控件;識別導致回發的命令(發件人),然後您可以執行數據庫更新。

1

您是否在頁面加載事件中將複選框的選中狀態設置爲false?

0

問題出現的原因之一(也可能是其他問題)是事件被註冊了兩次。

在「InitializeComponent」裏面的代碼中檢查你的代碼。這將導致該事件被註冊兩次,因此觸發兩次。

您需要在一個地方將其刪除以解決問題。

rAm。

1

這種行爲可能有幾個原因。在我的情況下,它是該事件正在註冊兩次:自動 一個時間作爲複選框定義
<asp:CheckBox ID="CheckBox1" runat="server" **OnCheckedChanged="ChangeReadFlag"** AutoPostBack="true" Checked='<%# (string)DataBinder.Eval(Container.DataItem, "READ_FLAG") == "1" %>' Enabled='<%# isSelectedRow(Container) %>' />

和第二時間的一部分 - 一個顯式登記某處代碼,通常在OnInit方法:
CheckBox1.CheckedChanged += new EventHandler(ChangeReadFlag);

爲了解決這個問題,您應該從代碼後面或從您的控件中刪除第二次註冊。

0

另一個潛在的問題是數據綁定發生的地方 - 我在代碼中沒有看到DataSource,所以我想你是在代碼隱藏的數據綁定。

如果您在回發時正在執行數據綁定,並且在第一個onChange事件觸發後,數據綁定事件很可能會重置複選框的狀態,從而導致該事件再次觸發。