c#winform中,DataGridView的选择列(DataGridViewCheckBoxColumn)中,如何实现条件选中?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c#winform中,DataGridView的选择列(DataGridViewCheckBoxColumn)中,如何实现条件选中?相关的知识,希望对你有一定的参考价值。

条件选中:比如我点击某行前面的选择框,然后对增长表进行判断,如果该行不能被选中,则选择无效;如果某些数据已经选中的,当点击其中的某行前面的选择框时,判断是否能取消,不能取消的话点选无效,点击过后依然是选中状态。如图所示:列表编号呈树结构,如果移除树节点,则应该移除其相应的子节点,当选中父节点0305时,则相应的以0305开头的所有行的选择框都应该选中,并且不能取消选中,除非取消的行的所有父节点都没选中的情况下才能取消,请问如何实现?

参考技术A 5.GridView和CheckBox结合:
效果图:

后台代码:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.htmlControls;
using System.Data.SqlClient;
public partial class Default5 : System.Web.UI.Page


SqlConnection sqlcon;
string strCon = "Data Source=(local);Database=北风贸易;Uid=sa;Pwd=sa";
protected void Page_Load(object sender, EventArgs e)

if (!IsPostBack)

bind();


protected void CheckBox2_CheckedChanged(object sender, EventArgs e)

for (int i = 0; i <= GridView1.Rows.Count - 1; i++)

CheckBox cbox = (CheckBox)GridView1.Rows[i].FindControl("CheckBox1");
if (CheckBox2.Checked == true)

cbox.Checked = true;

else

cbox.Checked = false;



protected void Button2_Click(object sender, EventArgs e)

sqlcon = new SqlConnection(strCon);
SqlCommand sqlcom;
for (int i = 0; i <= GridView1.Rows.Count - 1; i++)

CheckBox cbox = (CheckBox)GridView1.Rows[i].FindControl("CheckBox1");
if (cbox.Checked == true)

string sqlstr = "delete from table where 身份证号码='" + GridView1.DataKeys[i].Value + "'";
sqlcom = new SqlCommand(sqlstr, sqlcon);
sqlcon.Open();
sqlcom.ExecuteNonQuery();
sqlcon.Close();


bind();

protected void Button1_Click(object sender, EventArgs e)

CheckBox2.Checked = false;
for (int i = 0; i <= GridView1.Rows.Count - 1; i++)

CheckBox cbox = (CheckBox)GridView1.Rows[i].FindControl("CheckBox1");
cbox.Checked = false;


public void bind()

string sqlstr = "select top 5 * from table ";
sqlcon = new SqlConnection(strCon);
SqlDataAdapter myda = new SqlDataAdapter(sqlstr, sqlcon);
DataSet myds = new DataSet();
sqlcon.Open();
myda.Fill(myds, "tb_Member");
GridView1.DataSource = myds;
GridView1.DataKeyNames = new string[] "身份证号码" ;
GridView1.DataBind();
sqlcon.Close();


前台主要代码:
<asp:GridView ID="GridView1" runat="server" AllowSorting="True" AutoGenerateColumns="False"
CellPadding="3" Font-Size="9pt" BackColor="White" BorderColor="#CCCCCC" BorderStyle="None" BorderWidth="1px">
<FooterStyle BackColor="White" ForeColor="#000066" />
<Columns>
<asp:TemplateField>
<ItemTemplate>
<asp:CheckBox ID="CheckBox1" runat="server" />
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="身份证号码" HeaderText="用户ID" SortExpression="身份证号码" />
<asp:BoundField DataField="姓名" HeaderText="用户姓名" SortExpression="姓名"/>

<asp:BoundField DataField="家庭住址" HeaderText="家庭住址" SortExpression="家庭住址"/>

</Columns>
<RowStyle ForeColor="#000066" />
<SelectedRowStyle BackColor="#669999" Font-Bold="True" ForeColor="White" />
<PagerStyle BackColor="White" ForeColor="#000066" HorizontalAlign="Left" />
<HeaderStyle BackColor="#006699" Font-Bold="True" ForeColor="White" />
</asp:GridView>
<asp:CheckBox ID="CheckBox2" runat="server" AutoPostBack="True" Font-Size="9pt" OnCheckedChanged="CheckBox2_CheckedChanged"
Text="全选" />
<asp:Button ID="Button1" runat="server" Font-Size="9pt" Text="取消" OnClick="Button1_Click" />
<asp:Button ID="Button2" runat="server" Font-Size="9pt" Text="删除" OnClick="Button2_Click" />
具体什么用法你自己在去看看,你把这个换成form程序就可以了,你试试把!追问

我用的是winform

追答

晕 你web 的换成 winform 就OK了 语法一样的

参考技术B private void dgv_CellContentClick(object sender, DataGridViewCellEventArgs e)

if ((bool)dgv.Rows[e.RowIndex].Cells["选择"].EditedFormattedValue == true)

for (int i = 0; i < dgvDeptName.Rows.Count; i++)

if (i != e.RowIndex)

if (dgv.Rows[i].Cells["编号"].Value.ToString().StartsWith(dgv.Rows[e.RowIndex].Cells["编号"].Value))

dgv.Rows[i].Cells["选择"].Value = true;





参考技术C 你可以遍历出所有的复选框,然后截取以0305开头的,如果是以这开头,然后获得这个复选框,Enabled设为不可用.ok?追问

关键是如何实现取消,比如上图中点击030501的复选框后,应该去判断它的父节点是否选中的,是的话就还是选中状态,也就是说点击无效

追答

其实不然,因为你点击了0305之后 ,你后面的比如说030501也应该选中,然后用enbled让它不可用对吗?所以,只要你点击0305之后,以它开头的都enbled了,那绝对的是点击无效嘛

追问

问题是当我点击0305的时候,其他都正常,但是0305的行却会改变为未选中状态,我试过在点击事件里面直接把值设成true,但是事件运行完后,它依然是未选中状态

追答

比如说,你选择0305后,先不考虑其他的事,首先它会处于选中状态,这是复选框的特性()
然后根据你的需求在点击事件中(click)中遍历这些复选框,以0305开头,当然不包括它
例如:if(0305.checked==true)
//其余substring全部选中.
else
//其余substring以它开头的都不选中.

追问

虽然问题没有解决,不过还是感谢你咯 分给你吧 我加了点分 现在200 呵呵

本回答被提问者采纳
参考技术D 这个是一个通用的取消方法,你自己改改吧:

for (int i = 0; i < dg_TableInfo.Rows.Count; i++)

DataGridViewCheckBoxCell checkCell = (DataGridViewCheckBoxCell)dg_TableInfo.Rows[i].Cells["CheckSelect"];

// if (!(bool)checkCell.FormattedValue)


if (Flag)
checkCell.Value = 1;
else

checkCell.Value = 0;




用c#winform拖的datagridview控件,当选中一行数据以后鼠标离开之后,就选不中了

用c#winform拖的datagridview控件,当选中一行数据以后鼠标离开之后,就选不中了这是怎么回事呢?鼠标离开以后,选中的一行又变白了

参考技术A 这个没关系,你只要点击了其中一行就行,然后去做你想要的操作。直接用DataGridView.SelectedIndex。。。获取选中行的值就行了 参考技术B 如果选中背景颜色,可以在行的click事件里添加 参考技术C 你那是滑动的效果吧, 不是选中, 选中时单击数据行

以上是关于c#winform中,DataGridView的选择列(DataGridViewCheckBoxColumn)中,如何实现条件选中?的主要内容,如果未能解决你的问题,请参考以下文章

C#winform中datagridview导出Excel

C#winform的DataGridView问题

Winform DataGridView到UWP Datagrid C#

C#winform 两个datagridview中的数据一键导出到同一个excel中两个sheet页里

C#Winform中DataGridView往某一行新增数据

winform datagridview 绑定 list .c#