dataGridView 添加checkbox列,點擊checkBox, 無法正確獲取是否選中的狀態
checkColumn = new DataGridViewCheckBoxColumn();
checkColumn.HeaderText = "select";
checkColumn.Name = "select";
dgv.Columns.Add(checkColumn);
Console.WriteLine(dgv.Columns.Count.ToString());
dgv.CellMouseClick += new DataGridViewCellMouseEventHandler((object sender, DataGridViewCellMouseEventArgs e) =>
{
if (e.ColumnIndex == 4)//列號為什么是4
{
//列印輸出行號
Console.WriteLine("index " + e.RowIndex.ToString());
if (e.ColumnIndex == 4)
{
int i = e.RowIndex;
Boolean ret = Convert.ToBoolean(dgv1.Rows[i].Cells["select"].Selected);
if (ret)
Console.WriteLine("true");
else
Console.WriteLine("false");
}
}
});
uj5u.com熱心網友回復:
參考https://www.cnblogs.com/moss_tan_jun/archive/2011/04/06/2007319.html
uj5u.com熱心網友回復:
dgv1.Rows[i].Cells["select"].Valueuj5u.com熱心網友回復:
參考了他的,但是幾個事件都不能正確獲取某行的checkbox的選中狀態。dgv.CellClick += dgv_CellClick;
dgv.CellValueChanged += dgv_CellValueChanged;
dgv.CellMouseClick
上面三個都不行。
uj5u.com熱心網友回復:
是獲取不到,還是獲取的是錯的??斷點除錯看看啊uj5u.com熱心網友回復:
在dgv_CellValueChanged事件中有反應了,但是永遠慢一拍。
private void dgv_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
//列印輸出行號
Console.WriteLine("index " + e.RowIndex.ToString());
if (e.ColumnIndex == 5)
{
int i = e.RowIndex;
Boolean ret = Convert.ToBoolean(dgv1.Rows[i].Cells["select"].Value);
if (ret)
Console.WriteLine("true");
else
Console.WriteLine("false");
}
}
依次取消選中第0-5行,然后依次選中第0-5行的check。列印如下:
index 0
false
index 1
false
index 2
false
index 3
false
index 4
false
index 0
true
index 1
true
index 2
true
index 3
true
取消第0行,沒反應,取消第一行,列印index 0 false, 取消第2行,列印index 1 false,以此類推。
這種有解決辦法么
uj5u.com熱心網友回復:
試了下,確實在點很快的情況下獲取狀態是錯誤的。uj5u.com熱心網友回復:
選中一行后,點Button,在 Buttun_Click里DataGridViewRow row = this.dataGridView1.SelectedRows[0];
object value = row.Cells[0].Value;
uj5u.com熱心網友回復:
沒太聽懂你的意思,這是要規定用戶習慣,每次必須選中行后,才能點擊checkbox?分兩步走?
另外,我發現上面的邏輯還有個問題,如果在同一行的的checkbox來回點擊就沒有任何反應。
uj5u.com熱心網友回復:
改為cell_doubleclick事件呢?uj5u.com熱心網友回復:
private void dataGridView1_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
if (e.ColumnIndex == 2)
{
bool isChecked = bool.Parse(this.dataGridView1.Rows[e.RowIndex].Cells[2].Value.ToString());
this.dataGridView1.Rows[e.RowIndex].Cells[2].Value = !isChecked;
}
}
加個事件試試
uj5u.com熱心網友回復:
首先,選中行的方式有3種, 其中一種就是只要點了當前行的任何一個單元格,就算選中行
所以你可以直接點checkbox,也就相當于選中行了,
然后隨便找個事件,
把我上面的代碼放進去就可以了,
沒返應可能是你代碼有問題,仔細看一下吧.試著把所有的關于dataGridview的事件全屏蔽了,
看看還出不出問題
uj5u.com熱心網友回復:
選中一行后,點Button,在 Buttun_Click里
DataGridViewRow row = this.dataGridView1.SelectedRows[0];
object value = row.Cells[0].Value;
沒太聽懂你的意思,這是要規定用戶習慣,每次必須選中行后,才能點擊checkbox?分兩步走?
另外,我發現上面的邏輯還有個問題,如果在同一行的的checkbox來回點擊就沒有任何反應。
首先,選中行的方式有3種, 其中一種就是只要點了當前行的任何一個單元格,就算選中行
所以你可以直接點checkbox,也就相當于選中行了,
然后隨便找個事件,
把我上面的代碼放進去就可以了,
沒返應可能是你代碼有問題,仔細看一下吧.試著把所有的關于dataGridview的事件全屏蔽了,
看看還出不出問題
我按照你上面的代碼來。然后只開了一個事件,然后點擊測驗。發現有的時候是正確的,有的時候就是反的。
照理說這種控制元件很常規的操作,怎么會這么麻煩呢
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using HslCommunication;
namespace vs_UdpS
{
public partial class Form_Config : Form
{
public Form_Config()
{
InitializeComponent();
InitDgv(dgv1);
}
public void InitDgv(DataGridView dgv)
{
dgv.RowCount = 30;
dgv.ColumnCount = 4;
dgv.SelectionMode = DataGridViewSelectionMode.FullRowSelect;//整行選中
//dgv.CellDoubleClick += new DataGridViewCellEventHandler(dgvCellDoubleClick);
dgv.Columns[0].Width = 200;
int idx = 0;
dgv.Rows[idx].Cells[2].Value = "";
idx = idx + 1;
dgv.Rows[idx].Cells[2].Value = "";
idx = idx + 1;
dgv.Rows[idx].Cells[2].Value = "";
idx = idx + 1;
dgv.Rows[idx].Cells[2].Value = "";
idx = idx + 1;
DataGridViewCheckBoxColumn checkColumn = new DataGridViewCheckBoxColumn();
checkColumn.HeaderText = "select";
checkColumn.Name = "select";
dgv.Columns.Add(checkColumn);
for (int i = 0; i < dgv.Rows.Count; i++ )
{
dgv.Rows[i].Cells[4].Value = true;
}
dgv.CellMouseClick += new DataGridViewCellMouseEventHandler(dgv_MouseClick);
//dgv.MultiSelect =
}
private void dgv_MouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
if (e.ColumnIndex == 4)
{
bool isChecked = bool.Parse(this.dgv1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString());
lbShow.Text = isChecked.ToString();
Console.WriteLine(isChecked.ToString());
this.dgv1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = !isChecked;
}
}
private void Form_Config_Load(object sender, EventArgs e)
{
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/284638.html
標籤:C#
上一篇:救命
