C# toolstrip按钮的奇怪行为
同一代码对toolstrip按钮的作用与对普通按钮的作用不同 应用。细节 datagridview总共由6列组成。第6列是一个复选框列,用于选择2行。按下工具栏按钮后,程序读取选定的行-[0]单元格索引值。这种情况通常会发生,当事件来自“正常”按钮时,程序实际上会获取2行值,但当事件从“工具条”按钮触发时,即使选择了2行,列表也只填充1个元素 代码:C# toolstrip按钮的奇怪行为,c#,C#,同一代码对toolstrip按钮的作用与对普通按钮的作用不同 应用。细节 datagridview总共由6列组成。第6列是一个复选框列,用于选择2行。按下工具栏按钮后,程序读取选定的行-[0]单元格索引值。这种情况通常会发生,当事件来自“正常”按钮时,程序实际上会获取2行值,但当事件从“工具条”按钮触发时,即使选择了2行,列表也只填充1个元素 代码: private void btnReportPrint\u单击(对象发送者,事件参数e) { var checkedRows=来自gridMeas
private void btnReportPrint\u单击(对象发送者,事件参数e)
{
var checkedRows=来自gridMeasD.Rows中的DataGridViewRow r
其中Convert.ToBoolean(r.Cells[5].Value)=true
选择r;
列表measIdList=新列表(2);
foreach(checkedRows中的var行)
{
添加(row.Cells[“clm_MeasID”].Value.ToString());
}
如果(measIdList.Count>2)
{
MessageBox.Show(“请仅选择两个不同的测量值以打印报告!”,“选择无效”,MessageBoxButtons.OK,MessageBoxIcon.Error);
}
else if(measIdList.Count==2)
{
字符串val1=measIdList[0];
字符串val2=measIdList[1];
if(!((val1[0]='F'和&val2[0]='C')| |(val1[0]='C'和&val2[0]='F'))
{
MessageBox.Show(“请仅选择两个不同的测量值以打印报告!”,“选择无效”,MessageBoxButtons.OK,MessageBoxIcon.Error);
}
else if((val1[0]='F'和&val2[0]='C')| |(val1[0]='C'和&val2[0]='F'))
{
MessageBox.Show(“报告打印!”,“成功”,MessageBoxButtons.OK,MessageBoxIcon.Asterisk);
}
measIdList.Clear();
}
}
我在寻找一个解释,因为它没有任何意义。我怀疑(我没有检查)点击toolstrip按钮不会导致DGV以点击常规按钮的方式结束对当前单元格的编辑,这意味着一个流程:
- 单击网格内的复选框;网格正在显示复选框编辑器组件,但该值尚未提交到基础单元格
- 单击工具条按钮;DGV仍在编辑单元格值,而在“单元格”属性中,它仍然与所看到的相反
- 扫描单元格中的选中值仅返回以前选中的单元格,而不是当前单元格
在枚举单元格集合之前,通过事件处理程序中的
DGV.EndEdit()
显式地告诉DGV结束对当前单元格的编辑,应该会有帮助在哪里定义了measIdList
?当btnReportPrint\u Click
进入时,您为什么不清除它?如果btnReportPrint\u Click
包含0或1项,您的measIdList
方法将崩溃-您需要删除//如果(measIdList.Count==2)
的注释。它在此事件函数之外(在它之前)但是这没有任何区别。你有没有研究过DGV失去对toolstripbutton的焦点与失去对普通按钮的焦点是否有什么不同/是你以某种方式对DGV存储它的内容进行“未提交”的第二个复选标记?调用dgv.EndEdit()作为事件处理程序的第一行是否会改变任何行为?@CaiusJard now我在开头添加了dvg.EndEdit(),现在它工作正常。非常感谢。
private void btnReportPrint_Click(object sender, EventArgs e)
{
var checkedRows = from DataGridViewRow r in gridMeasD.Rows
where Convert.ToBoolean(r.Cells[5].Value) == true
select r;
List<string> measIdList = new List<string>(2);
foreach (var row in checkedRows)
{
measIdList.Add(row.Cells["clm_MeasID"].Value.ToString());
}
if (measIdList.Count > 2)
{
MessageBox.Show("Please only select 2 different measurements to print out a report !", "Invalid Selection", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
else if(measIdList.Count == 2)
{
string val1 = measIdList[0];
string val2 = measIdList[1];
if (!((val1[0] == 'F' && val2[0] == 'C') || (val1[0] == 'C' && val2[0] == 'F')))
{
MessageBox.Show("Please only select 2 different measurements to print out a report !", "Invalid Selection", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
else if ((val1[0] == 'F' && val2[0] == 'C') || (val1[0] == 'C' && val2[0] == 'F'))
{
MessageBox.Show("Report printing!", "Successful", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
}
measIdList.Clear();
}
}