Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# toolstrip按钮的奇怪行为_C# - Fatal编程技术网

C# toolstrip按钮的奇怪行为

C# toolstrip按钮的奇怪行为,c#,C#,同一代码对toolstrip按钮的作用与对普通按钮的作用不同 应用。细节 datagridview总共由6列组成。第6列是一个复选框列,用于选择2行。按下工具栏按钮后,程序读取选定的行-[0]单元格索引值。这种情况通常会发生,当事件来自“正常”按钮时,程序实际上会获取2行值,但当事件从“工具条”按钮触发时,即使选择了2行,列表也只填充1个元素 代码: private void btnReportPrint\u单击(对象发送者,事件参数e) { var checkedRows=来自gridMeas

同一代码对toolstrip按钮的作用与对普通按钮的作用不同

应用。细节

datagridview总共由6列组成。第6列是一个复选框列,用于选择2行。按下工具栏按钮后,程序读取选定的行-[0]单元格索引值。这种情况通常会发生,当事件来自“正常”按钮时,程序实际上会获取2行值,但当事件从“工具条”按钮触发时,即使选择了2行,列表也只填充1个元素

代码:

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