c# – Windows窗体 – > DataGridView-> DataGridViewCheckBoxColumn取消选中所有留下的一件物品已检查

c# – Windows窗体 – > DataGridView-> DataGridViewCheckBoxColumn取消选中所有留下的一件物品已检查,第1张

概述我们在 Windows窗体中有一个非常奇怪的问题,我们似乎无法弄清楚. 我们的Windows窗体在第一列中有一个带有DataGridViewCheckBoxColumn的DataGridView. 我们添加了以下功能,允许用户切换 – >单击以选择此网格中的多个行: int colHit = gvLibrary.HitTest(e.X, e.Y).ColumnIndex; int 我们在 Windows窗体中有一个非常奇怪的问题,我们似乎无法弄清楚.

我们的windows窗体在第一列中有一个带有DataGrIDVIEwCheckBoxColumn的DataGrIDVIEw.

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

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;            }        }    }

这是按预期工作的.

我们还为控件添加了一个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;        }    }

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

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

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

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

我认为迭代所有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;    }}
总结

以上是内存溢出为你收集整理的c# – Windows窗体 – > DataGridView-> DataGridViewCheckBoxColumn取消选中所有留下的一件物品已检查全部内容,希望文章能够帮你解决c# – Windows窗体 – > DataGridView-> DataGridViewCheckBoxColumn取消选中所有留下的一件物品已检查所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1232233.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存