加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – Windows窗体 – > DataGridView-> DataGridView

发布时间:2020-12-15 23:22:12 所属栏目:百科 来源:网络整理
导读:我们在 Windows窗体中有一个非常奇怪的问题,我们似乎无法弄清楚. 我们的Windows窗体在第一列中有一个带有DataGridViewCheckBoxColumn的DataGridView. 我们添加了以下功能,允许用户切换 – 单击以选择此网格中的多个行: int colHit = gvLibrary.HitTest(e.X,
我们在 Windows窗体中有一个非常奇怪的问题,我们似乎无法弄清楚.

我们的Windows窗体在第一列中有一个带有DataGridViewCheckBoxColumn的DataGridView.

enter image description here

我们添加了以下功能,允许用户切换 – >单击以选择此网格中的多个行:

int colHit = gvLibrary.HitTest(e.X,e.Y).ColumnIndex;
        int lastRowHit;
        //mouse left click
        if (e.Button == MouseButtons.Left)
        {
            if (colHit == 0)
            {
                if (Control.ModifierKeys == Keys.Shift)
                {
                    lastRowHit = gvLibrary.HitTest(e.X,e.Y).RowIndex;
                    ShiftClickCheckBoxSetter(this.gvLibrary,int.Parse(txtFirstClickRow.Text),lastRowHit);

                }
                else
                {
                    int firstRowHit = gvLibrary.HitTest(e.X,e.Y).RowIndex;
                    txtFirstClickRow.Text = firstRowHit.ToString();
                }
            }
        }

这是CheckBoxSetter代码:

private void ShiftClickCheckBoxSetter(DataGridView dataGridView,int p,int lastRowHit)
    {
        if (p < lastRowHit)
        {
            for (int i = p; i < lastRowHit; i++)
            {
                dataGridView.Rows[i].Cells[0].Value = true;
            }
        }
        else//
        {
            for (int i = p; i >= lastRowHit; i--)
            {
                dataGridView.Rows[i].Cells[0].Value = true;
            }
        }
    }

这是按预期工作的.

enter image description here

我们还为控件添加了一个ContextMenuStrip,用于右键单击事件.

else if (e.Button == MouseButtons.Right)
        {
            if (colHit != 0)
            {
                ContextMenuStrip m = new ContextMenuStrip();
                m.Items.Add("Select All",null,m_LibraryItemClicked);
                m.Items.Add("Select None",m_LibraryItemClickedNone);
                m.Show(gvLibrary,e.Location);
            }
        }

代表活动一:

void m_LibraryItemClicked(object sender,EventArgs e) {
        foreach (DataGridViewRow dgvr in gvLibrary.Rows)
        {
            if (dgvr.Selected) {
                dgvr.Selected = false;
            }

            dgvr.Cells["LSelect"].Value = true;
        }
    }

代表事件二:

private void m_LibraryItemClickedNone(object sender,EventArgs e)
    {
        foreach (DataGridViewRow dgvr in gvLibrary.Rows)
        {
            if (dgvr.Selected)
               dgvr.Selected = false;

            dgvr.Cells["LSelect"].Value = false;
        }
    }

这允许用户选择全部或选择无复选框.

Select All/Select None

选择“全选”选项后,将选中所有复选框:

All Selected

但是,选择“选择无”选项时:

Select None

取消选中所有复选框,但在Shift-Click事件中选中的最后一个复选框除外:

All But One

我认为迭代所有Grid Rows并将复选框设置为未选中就足够了,IE:

private void m_LibraryItemClickedNone(object sender,EventArgs e)
    {
        foreach (DataGridViewRow dgvr in gvLibrary.Rows)
        {
            if (dgvr.Selected)
               dgvr.Selected = false;

            dgvr.Cells["LSelect"].Value = false;
        }
    }

但是,似乎有某种状态属性禁止在该行中的此复选框进行更改.

提前致谢.

解决方法

我检查了你的代码,可以重现这种行为.问题似乎与当前单元格(不是选定的单元格)有关.当您尝试更改此特定单元格时,操作不会立即执行.

要更改此行为,请添加dataGridView1.CurrentCell = null;在更改“LSelect”单元格的值之前.这应该可以解决您的问题.

private void m_LibraryItemClickedNone(object sender,EventArgs e)
{
    dataGridView1.CurrentCell = null;    
    foreach (DataGridViewRow dgvr in gvLibrary.Rows)
    {
        if (dgvr.Selected)
           dgvr.Selected = false;

        dgvr.Cells["LSelect"].Value = false;
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读