2009-01-08 71 views
2

我有一個gridview控件綁定到對象數據源。此外,我想顯示的列,我想在這裏顯示這個asp:GridView中的CheckBoxField - VS 2008

<Columns> 
     <asp:CheckBoxField DataField="Locked" Visible="true" AccessibleHeaderText="On Hold" ReadOnly="false"/> 
</Columns> 

幾個問題:1。 如果我做上面說的,我的網頁加載和某些行有他們的記錄標記爲檢查和根據數據,某些行不會。但是,用戶無法點擊任何記錄來撤銷其複選標記。看來這是處於禁用狀態。

  1. 看起來這個checkboxfield沒有onclick事件。我想在用戶選中或取消選中每條記錄時立即更新我的記錄。是糟糕的設計在這裏,但我的雙手被縛

  2. 假如我跟<asp:checkbox>去一個<itemtemplate>中如何綁定該對象的數據源中我的鎖定列或做我必須做的,通過overiding方法的Onne gridview控件的?

+0

是否存在您可以使用的OnCheckChanged事件? – 2009-01-08 19:34:58

回答

0

對於點擊事件,我找不出OnClickChange,所以我推出了自己的。

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Linq; 
using System.Data.Linq; 
using System.Data.Linq.Mapping; 
using System.Web; 
using System.Web.UI.WebControls; 


namespace Web.Library.Controls.Commands 
{ 
    public class CommandCheckBox : System.Web.UI.WebControls.CheckBox 
    { 
     private static readonly object EventCommand = new object(); 

     public event CommandEventHandler Command 
     { 
      add 
      { 
       Events.AddHandler(EventCommand, value); 
      } 
      remove 
      { 
       Events.RemoveHandler(EventCommand, value); 
      } 
     } 

     public string CommandName 
     { 
      get 
      { 
       if (this.ViewState["CommandName"] == null) 
        return string.Empty; 

       return (string)this.ViewState["CommandName"]; 
      } 
      set { this.ViewState["CommandName"] = value; } 
     } 

     public string CommandArgument 
     { 
      get 
      { 
       if (this.ViewState["CommandArgument"] == null) 
        return string.Empty; 

       return (string)this.ViewState["CommandArgument"]; 
      } 
      set { this.ViewState["CommandArgument"] = value; } 
     } 

     protected virtual void OnCommand(CommandEventArgs args) 
     { 
      CommandEventHandler commandEventHand = Events[EventCommand] as CommandEventHandler; 

      if (commandEventHand != null) 
      { 
       commandEventHand(this, args); 
      } 

      base.RaiseBubbleEvent(this, args); 
     } 

     protected override void OnCheckedChanged(EventArgs e) 
     { 
      base.OnCheckedChanged(e); 

      CommandEventArgs args = new CommandEventArgs(this.CommandName, this.CommandArgument); 

      this.OnCommand(args); 
     } 


     public CommandCheckBox() 
     { 
     } 

    } 
} 

至於數據綁定和更新,我只是在GridRowCommand上自己處理它。

0

您的控件被鎖定,因爲如果行處於編輯模式,GridView將只允許您編輯一行。我認爲你真正想要的是在TemplateField中定義的複選框。然後,你可以設置初始「選中」值後面的代碼或者做類似:

<asp:CheckBox ID="MyCheckBox" runat="server" Checked='<%#Eval("Locked")' ... /> 

至於觸發,可以點OnCheckedChange屬性到您所選擇的功能,但我不知道如何告訴它哪一行被檢查過。

更好的選擇是使用Button或ImageButton控件來做同樣的事情。這樣,您可以使用行ID或任何您需要的方式填充CommandArgument,並且在處理GridView的RowCommand時可以訪問它。

4

要回答#2,我將與<asp:CheckBox>控制走在<ItemTemplate>,然後在GridView_RowDataBound事件設置Checked屬性:

protected void grdSomething_RowDataBound (Object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
     BusinessObject data = (BusinessObject) e.Row.DataItem; 
     CheckBox chkLocked = (CheckBox) e.Row.FindControl("chkLocked"); 
     chkLocked.Checked = data.Locked; 
    } 
} 

至於問題#1,我用一個解決方案在過去取得好成績的是讓<asp:CheckBox>的客戶端onClick事件調用更新相應業務對象的ASP.NET Ajax異步頁方法(本質上是專用Web服務)。這對你來說不是最簡單的方法,但用戶的體驗非常光滑(即沒有整頁回發):

您需要在代碼隱藏文件中使用靜態方法來更新適當的業務對象。類似的信息(這是相當粗糙):

[WebMethod] 
public static void ToggleLockedStatus (string key) 
{ 
    if (BusinessObjectDictionary.ContainsKey(key)) 
    { 
     BusinessObjectDictionary[ key ].Locked = !BusinessObjectDictionary[ key ].Locked; 
    } 
    else 
    { 
     throw new Exception("The business object specified was not found."); 
    } 
} 

有關如何使用ASP.NET AJAX,check out MSDN here做的細節。