111,077
社区成员




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");
}
}
});
修改为只读的话,check根本选不中 我大体猜测,代码啥的应该没什么问题,你单元格里面添加了checkbox ,无法获取选中,如果你的列是可编辑的,修改为当前列为只读,应该可以解决
我大体猜测,代码啥的应该没什么问题,你单元格里面添加了checkbox ,无法获取选中,如果你的列是可编辑的,修改为当前列为只读,应该可以解决
private void Form52_Load(object sender, EventArgs e)
{
DataTable dt = new DataTable();
DataColumn dc = new DataColumn();
dc.ColumnName = "aa";
dt.Columns.Add(dc);
DataRow dr = dt.NewRow();
dr["aa"] = "bb";
dt.Rows.Add(dr);
dataGridView1.DataSource = dt;
DataGridViewCheckBoxColumn dvck = new DataGridViewCheckBoxColumn();
dvck.Name = "ck";
dvck.HeaderText = "选择";
dvck.TrueValue = "1";
dvck.FalseValue = "0";
dataGridView1.Columns.Add(dvck);
}
private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
if (e.RowIndex<0)
{
return;
}
if (dataGridView1.Rows[e.RowIndex].Cells["ck"].Value ==null || dataGridView1.Rows[e.RowIndex].Cells["ck"].Value.ToString() == "0")
{
dataGridView1.Rows[e.RowIndex].Cells["ck"].Value = "1";
}
else
{
dataGridView1.Rows[e.RowIndex].Cells["ck"].Value = "0";
}
label1.Text = dataGridView1.Rows[e.RowIndex].Cells["ck"].Value.ToString();
}
[quote=引用 20 楼 wang_peng 的回复:]EditedFormattedValue 这东西,楼主更蒙, 而且少用CellClick, CellClic几乎就是最底层的事件,一但业务复杂,很难控制, 那么多衍生出来的事件,为什么不用呢?
都在一直强调这个焦点位置,实际上它只需要能实现将EditedFormattedValue为true的行,获取出来,就可以去做后面逻辑上的处理。 如果说,是要处理实行行上的逻辑,那就需要考虑到当前选中行焦点上的问题。实时行信息的获取和修改,一般直接用CellClick事件 之前我也一直在困扰这个原因,实际上完全可以不用去深究这个东西。 只需要在处理的位置,先进行:Dgv.EndEdit();取消单元格的编辑状态,就不会在获取行信息时报错。
EditedFormattedValue 这东西,楼主更蒙, 而且少用CellClick, CellClic几乎就是最底层的事件,一但业务复杂,很难控制, 那么多衍生出来的事件,为什么不用呢?
[quote=引用 12 楼 number007cool 的回复:][quote=引用 11 楼 wang_peng 的回复:][quote=引用 8 楼 number007cool 的回复:][quote=引用 7 楼 wang_peng 的回复:]选中一行后,点Button,在 Buttun_Click里
DataGridViewRow row = this.dataGridView1.SelectedRows[0];
object value = row.Cells[0].Value;
[quote=引用 11 楼 wang_peng 的回复:][quote=引用 8 楼 number007cool 的回复:][quote=引用 7 楼 wang_peng 的回复:]选中一行后,点Button,在 Buttun_Click里 DataGridViewRow row = this.dataGridView1.SelectedRows[0]; object value = row.Cells[0].Value;
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)
{
}
}
}
[/quote]
1.如果你就这点代码,那你这代码没有什么问题,应该还是你操作的事
2.dgv_MouseClick 这个事件按你代码逻辑,没必要用,DataGridViewCheckBoxCell本身就点击的时候自己就可以变化,
3. dgv.RowCount = 30; dgv.ColumnCount = 4; 这什么要这样搞呢, 数据源上不要直接操作控件,
不了解原理的情况下,很麻烦,
要操作数据源, 通过数据源的变化, 在datagridview显示出来,就有点像mvvm的思想.
4.所以
DataTable dt1 = new DataTable();
dt1.TableName = "dt1";
dt1.Columns.Add("select", typeof(Boolean));
dt1.Columns.Add("Name");
for (int i = 0; i < 100; i++)
{
DataRow dataRow = dt1.NewRow();
dataRow[0] = true;
dataRow[1] = i.ToString() + ".Name";
dt1.Rows.Add(dataRow);
}
DataGridViewTextBoxColumn columnName = new DataGridViewTextBoxColumn();
columnName.HeaderText = "Name";
columnName.DataPropertyName = "Name";
this.dataGridView1.Columns.Add(columnName);
DataGridViewCheckBoxColumn columnSelect = new DataGridViewCheckBoxColumn();
columnSelect.HeaderText = "select";
columnSelect.DataPropertyName = "select";
this.dataGridView1.Columns.Add(columnSelect);
this.dataGridView1.AutoGenerateColumns = false;
this.dataGridView1.DataSource = dt1;
这样,尽量操作DataTable,当然你也可以用其它替换DataTable.
for (int i = 0; i < DgvUser.Rows.Count; i++)
{
if ((bool)DgvUser.Rows[i].Cells[0].EditedFormattedValue == true)
{
Info.Add((int)DgvUser.Rows[i].Cells["id"].Value);
DgvUser.Rows.RemoveAt(DgvUser.Rows[i].Index);
i--;
//删除1行时,行索引会发生改变。比如删除5、6行,删除第5行时,第6行的索引会变成5
}
else
continue;
}
实际上在学习Dgv的过程中,是先要搞清楚对象每种事件的触发特点,先后顺序。这样才能有助于你设计时,能快速调用效率较高的Dgv事件。
DataGridViewCheckBoxColumn multiselect = CreateCheckColumn("multiselect", "选择");
Dgv.Columns.Insert(0, multiselect);
//其中【CreateCheckColumn】方法:
/// <summary>
/// 创建基于DataGridView多选CheckBox控件
/// </summary>
/// <param name="ChkName">对象Name</param>
/// <param name="HeaderCaption">对象HeaderText</param>
/// <param name="DataFieldname">对象DataPropertyName</param>
/// <returns></returns>
public static DataGridViewCheckBoxColumn CreateCheckColumn(string ChkName, string HeaderCaption, string DataFieldname = null)
{
DataGridViewCheckBoxColumn column = new DataGridViewCheckBoxColumn()
{
Name = ChkName,
HeaderText = HeaderCaption,
DataPropertyName = DataFieldname,
SortMode = DataGridViewColumnSortMode.NotSortable,
TrueValue = false,
ReadOnly = true,
AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells,
FlatStyle = FlatStyle.Standard,
CellTemplate = new DataGridViewCheckBoxCell()
};
column.CellTemplate.Style.BackColor = Color.Beige;
return column;
}
2、实现在点击每行或单元格时,自动钩选CheckBox:(可以添加到Form_Load或自定义类构造函数来实现)
/// <summary>
/// 最后选中行号
/// </summary>
public int LastRowIndex { get; set; }
private void Form_Load(object sender, EventArgs e)
{
//单元格单击事件
Dgv.CellClick += new DataGridViewCellEventHandler(Dgv_CellClick);
}
/// <summary>
/// 单元格单击事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public void Dgv_CellClick(object sender, DataGridViewCellEventArgs e)
{
DataGridView grid = sender as DataGridView;
if (e.ColumnIndex == -1 || e.RowIndex == -1) return;
LastRowIndex = e.RowIndex;
if (e.ColumnIndex > 0)
{
//grid.ClearSelection();
for (int i = 0; i < grid.Rows.Count; i++)
{
DataGridViewCheckBoxCell cell = grid.Rows[i].Cells[0] as DataGridViewCheckBoxCell;
if (i == e.RowIndex)
cell.Value = true;
else
cell.Value = false;
}
}
}
3、最后,就是在需要的位置,去实现判断CheckBox打钩的行逻辑上的处理,Demo:
Dgv.EndEdit();
foreach (DataGridViewRow row in DgvJob.Rows)
{
DataGridViewCheckBoxCell checkBoxCell = row.Cells[0] as DataGridViewCheckBoxCell;
bool CheckState = checkBoxCell.Value != null ? (bool)checkBoxCell.Value : false;
if (CheckState)
{
//是否有重复添加
//string select_Jobno = row.Cells["Jobna"].Value.ToString();
string select_Jobna = row.Cells["Jobna"].EditedFormattedValue.ToString();
DataRow[] dtRow = DgvHelper.dtBranchJob.Select("Jobna ='" + select_Jobna + "'");
if (dtRow != null && dtRow.Length > 0)
{
if (MessageDxUtil.ShowYesNoAndError("职位名称【" + select_Jobna + "】已存在本部门中,不允许重复新增,是否自动删除此行?") == DialogResult.Yes)
{
Dgv.AllowUserToAddRows = false; //禁止添加
Dgv.Rows.Remove(row);
}
return;
}
BranJob BranJobObj = new BranJob()
{
Branno = DgvHelper.BranObj.Branno,
Jobno = row.Cells["Jobna"].Value.ToString(),
Planqty = (int)row.Cells["Planqty"].Value,
Overtime = row.Cells["Overtime"].Value != DBNull.Value ? (decimal)row.Cells["Overtime"].Value : 0
};
AddObjInfo.Add(BranJobObj);
}
}
[quote=引用 8 楼 number007cool 的回复:][quote=引用 7 楼 wang_peng 的回复:]选中一行后,点Button,在 Buttun_Click里
DataGridViewRow row = this.dataGridView1.SelectedRows[0];
object value = row.Cells[0].Value;
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)
{
}
}
}
[quote=引用 7 楼 wang_peng 的回复:]选中一行后,点Button,在 Buttun_Click里 DataGridViewRow row = this.dataGridView1.SelectedRows[0]; object value = row.Cells[0].Value;