English 中文(简体)
在GridView中的asp:CheckBoxField - VS 2008
原标题:
  • 时间:2009-01-08 19:29:32
  •  标签:

我有一个GridView控件绑定到一个对象数据源。除了我想要显示的列外,我还想要显示这个。

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

Couple of questions here: 1. If I do the above said, my page loads and certain rows have their records marked as checked and certain rows do not, as per data. However, the user is unable to click on any records to undo their check marks. It appears that this is in a disabled state.

  1. 似乎这个复选框字段没有onclick事件。我希望当用户选中或取消每条记录时立即更新我的记录。是的,设计不好,但我的手被绑住了。

  2. 如果我要在中使用,我该如何将其绑定到对象数据源中的锁定列,还是我必须通过重写gridview控件的一个方法来实现?

问题回答

对于 click 事件,我也无法弄清 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中自己处理了它。

您的控件被锁定,因为GridView只有在行处于编辑模式时才能编辑行。我认为您真正需要的是在TemplateField中定义复选框。然后,您可以通过在代码后台设置初始“选中”值或执行类似以下操作的方式来完成:

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

至于触发器,您可以将OnCheckedChange属性指向您选择的函数,但我不确定您如何告诉它哪一行已被选中。

更好的选择可能是使用按钮或ImageButton控件来完成相同的事情。这样,您可以使用行ID或您需要的任何其他内容填充CommandArgument,并在处理GridView的RowCommand时访问它。





相关问题
热门标签