bootgrid自定义,bootgrid单选BUG

版本:1.3.1

     有些属性可以直接通过data-形式修改,比如查询按钮的显示隐藏:

<table id="uploadFileList" class="table table-condensed table-hover table-striped" data-toggle="bootgrid" 
    data-ajax="true" data-url="getFileList" data-navigation=2>
     设置data-navigation=2会隐藏自带的查询及列选择按钮。如果设置为0,会隐藏所有按钮,包括分页按钮。

     有些属性可以直接在HTML中以data-的形式覆盖,有些属性则不可以,具体可以在源码1172中可以看到:

// note: The following properties should not be used via data-api attributes
    所以,有些属性就不要浪费时间想怎么覆盖了,直接修改源码吧,比如labels,设置各种提示信息的,

本来想通过data-形式修改的,浪费了好多时间也没实现,只能通过修改源码来实现了。当然,你要是硬要这

样,通过修改源码也可以实现,我直接修改配置,这样简单点:

    line1296:

       labels: {
            all: "All",
            infos: "Showing {{ctx.start}} to {{ctx.end}} of {{ctx.total}} entries",
            loading: "Loading...",
            noResults: "No results found!",
            refresh: "Refresh",
            search: "Search"
        }

    修改为

       labels: {
	            all: "全部",
	            infos: "显示 {{ctx.start}} 到 {{ctx.end}} 条记录,总共 {{ctx.total}} 条记录",
	            loading: "加载中...",
	            noResults: "没有记录!",
	            refresh: "刷新",
	            search: "查询"
	        }
    修改完后效果如下:


    如果需要自动换行,需要在对应的列上加上属性data-css-class="breakwordall",类breakwordall的定义如下:

.breakwordall{
  	white-space:normal !important;
  }
    需要加上important标记,因为bootgrid默认的css如下:

.bootgrid-table td {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
    即不自动换行,如果超出则显示...,所以要通过important把它覆盖掉。

bootgrid设置为单选中,点击checkbox会无效,bootgrid代码如下:

function registerRowEvents(tbody)
    {
        var that = this,
            selectBoxSelector = getCssSelector(this.options.css.selectBox);

        if (this.selection)
        {
            //点击checkbox时的事件处理
            tbody.off("click" + namespace, selectBoxSelector)
                .on("click" + namespace, selectBoxSelector, function(e)
                {
                    e.stopPropagation();

                    var $this = $(this),
                        id = that.converter.from($this.val());

                    if ($this.prop("checked"))
                    {
                        that.select([id]);//这里调用了select方法
                    }
                    else
                    {
                        that.deselect([id]);
                    }
                });
        }
        ............
    }

//select 方法如下:
    Grid.prototype.select = function(rowIds)
    {
        if (this.selection)
        {
            rowIds = rowIds || this.currentRows.propValues(this.identifier);

            var id, i,
                selectedRows = [];

            while (rowIds.length > 0 && !(!this.options.multiSelect && selectedRows.length === 1))
            {
                id = rowIds.pop();
                if ($.inArray(id, this.selectedRows) === -1)
                {
                    for (i = 0; i < this.currentRows.length; i++)
                    {
                        if (this.currentRows[i][this.identifier] === id)
                        {
                            selectedRows.push(this.currentRows[i]);
                            this.selectedRows.push(id);
                            break;
                        }
                    }
                }
            }

            if (selectedRows.length > 0)
            {
                var selectBoxSelector = getCssSelector(this.options.css.selectBox),
                    selectMultiSelectBox = this.selectedRows.length >= this.currentRows.length;

                i = 0;
                while (!this.options.keepSelection && selectMultiSelectBox && i < this.currentRows.length)
                {
                    selectMultiSelectBox = ($.inArray(this.currentRows[i++][this.identifier], this.selectedRows) !== -1);
                }
                this.element.find("thead " + selectBoxSelector).prop("checked", selectMultiSelectBox);

                if (!this.options.multiSelect)
                {//这里触发了所有已check的checkbox的click方法
                     this.element.find("tbody > tr " + selectBoxSelector + ":checked")
                        .trigger("click" + namespace);
                }

                for (i = 0; i < this.selectedRows.length; i++)
                {
                    this.element.find("tbody > tr[data-row-id=\"" + this.selectedRows[i] + "\"]")
                        .addClass(this.options.css.selected)._bgAria("selected", "true")
                        .find(selectBoxSelector).prop("checked", true);
                }

                this.element.trigger("selected" + namespace, [selectedRows]);
            }
        }

        return this;
    };

    注意红色部分的代码(红色没效果,看注释吧),在没有多选的情况下,bootgrid会触发所有已check的checkbox的click事件,再次点击之后,相当于点了

两次checkbox,所以checkbox状态又变成未选中了。

    把select的红色代码修改如下,可以解决这个问题:

                        var lastId = this.selectedRows[this.selectedRows.length-1];
                	var checkboxes = this.element.find("tbody > tr " + selectBoxSelector + ":checked");
                	for (i = 0; i < checkboxes.length; i++) {
                	    var $checkbox = $(checkboxes[i]);
                	    if (lastId != $checkbox.val()) {//如果不是本次点击的checkbox,才触发click事件
                	        $checkbox.trigger("click" + namespace);
                	    }
                	}



---------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 <a href="#" data-toggle="control-sidebar"><i class="fa fa-gears"></i></a>

  controlSidebarOptions: {
    //Which button should trigger the open/close event
    toggleBtnSelector: "[data-toggle='control-sidebar']",
    //The sidebar selector
    selector: ".control-sidebar",
    //Enable slide over content
    slide: true
  }
  var o = $.AdminLTE.options.controlSidebarOptions;
      //Get the sidebar
      var sidebar = $(o.selector);
      //The toggle button
      var btn = $(o.toggleBtnSelector);

      //Listen to the click event
      btn.on('click', function (e) {
        e.preventDefault();
        //If the sidebar is not open
        if (!sidebar.hasClass('control-sidebar-open')
          && !$('body').hasClass('control-sidebar-open')) {
          //Open the sidebar
          _this.open(sidebar, o.slide);
        } else {
          _this.close(sidebar, o.slide);
        }
      });



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MFC(Microsoft Foundation Class)是微软提供的一套用于windows平台开发的C++类库。在MFC中,可以通过自定义工具栏来实现单选按钮的功能。 步骤如下: 1. 首先,需要在MFC对话框资源中添加工具栏控件。可以使用资源编辑器打开对话框的资源文件,并在工具栏控件区域拖拽一个工具栏控件。 2. 在对话框类的头文件中添加成员变量来引用工具栏控件。可以使用ClassWizard工具来自动生成对话框类的成员变量。 3. 在对话框类的初始化函数OnInitDialog()中,添加以下代码来将工具栏控件与对话框关联起来,并设置单选按钮的样式。 ```cpp m_ToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC); // 添加单选按钮 UINT nIDButton = m_ToolBar.GetDlgCtrlID(); // 获取工具栏控件的ID m_ToolBar.GetToolBarCtrl().SetExtendedStyle(TBSTYLE_EX_MIXEDBUTTONS); m_ToolBar.GetToolBarCtrl().AddButton(nIDButton, TBBS_BUTTON, MFCS_HILITE, NULL, "按钮1"); m_ToolBar.GetToolBarCtrl().AddButton(nIDButton + 1, TBBS_BUTTON, MFCS_HILITE, NULL, "按钮2"); m_ToolBar.GetToolBarCtrl().CheckButton(nIDButton); // 默认选中按钮1 // 调整工具栏尺寸和位置 CRect rect; GetClientRect(&rect); m_ToolBar.SetWindowPos(NULL, rect.left, rect.top, rect.Width(), 30, SWP_SHOWWINDOW); ``` 4. 在对话框类的消息映射函数中添加以下代码来处理单选按钮的切换事件。 ```cpp ON_COMMAND_RANGE(ID_BUTTON1, ID_BUTTON2, OnButtonClicked) void CMyDialog::OnButtonClicked(UINT nID) { // 判断单选按钮的ID,并进行相应的处理 switch (nID) { case ID_BUTTON1: // 按钮1被选中 break; case ID_BUTTON2: // 按钮2被选中 break; } } ``` 通过以上步骤,我们就可以在MFC自定义工具栏中实现单选按钮的功能。根据实际需求,可以添加更多的单选按钮,并在按钮事件中编写相应的处理逻辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值