同事写的一组代码,现在出了点bug,不知道该怎么改.
 添加了DeveloperExpress.xtraGrid.gridControl控件,在gridview里显示了一组数据,每行前边添加了checkbox(checkEdit)的选择框,实现的功能是对选择的用户进行操作,但是最多只能让选5个,到了5个以后就不让选了,可取消选择选其他的用户。
 现在的问题是:1、选择5个以后再点,就不能选了,然后再取消选择会报错。
               2.我自己写了个buttonClick事件,目的是让所有选择都清空,重新选,其结果是没有了只能选择5个的限制,可以多选。
会的帮帮忙,谢谢了。-------------------------------------        void biSendSms_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            ceIschoose.ValueChecked = false;
        }        void ceIschoose_EditValueChanging(object sender, ChangingEventArgs e)
        {
         
            bool isChoose = (bool)e.NewValue;
            if (isChoose)
            {
                if (!sendSmsFamilyDic.ContainsKey(currentFamily.FamilyId))
                    sendSmsFamilyDic.Add(currentFamily.FamilyId, currentFamily);
            }
            if(!isChoose)
            {
                if (sendSmsFamilyDic.ContainsKey(currentFamily.FamilyId))
                    sendSmsFamilyDic.Remove(currentFamily.FamilyId);
            }
         
        }
        void gvCremains_FocusedRowChanged(object sender, FocusedRowChangedEventArgs e)
        {           
            gvCremains.CollapseAllDetails();
            gvCremains.ExpandMasterRow(e.FocusedRowHandle);
            if (sendSmsFamilyDic.Count >= 5)
            {
                bool isChoose = false;
               
                int handle = e.PrevFocusedRowHandle;
                DataRow row = gvCremains.GetDataRow(handle);  
                //出错的地方:错误是指定的转换无效。
               isChoose =(bool)row["IsChoose"];
                if (isChoose)
                {
                    colIsChoose.OptionsColumn.AllowEdit = false;
                }
                else
                {
                    colIsChoose.OptionsColumn.AllowEdit = true;
                }
            }
            if (sendSmsFamilyDic.Count < 5)
            {
                colIsChoose.OptionsColumn.AllowEdit = true;
            }
        }

解决方案 »

  1.   

    看到程序就头大,你的那个DeveloperExpress.xtraGrid.gridControl是不是自定义控件啊!在点击BUTTON时为什么不直接遍例gridview的所有行,看选中的行是否大于5,如果不是则报错
      

  2.   

    DataRow row = gvCremains.GetDataRow(handle); handle参数得是datarow类型的吧  
      

  3.   

    isChoose =(bool)row["IsChoose"]; 如果这样转换不行
    那就
    if(row["IsChoose"]==选种)//自己想办法判断是否选种吧!
    {
      isChoose=true;
    }
    if(isChoose)
    {
       ........
    }
      

  4.   

    1 用一个集合存放选中的项,重新选择时记得清空;
    2 清空可用FindControl遍历一下,checked=false;
      

  5.   

     Dictionary<string, Family> sendSmsFamilyDic = new Dictionary<string, Family>();
    //定义了全局变量 sendSmsFamilyDic  void biSendSms_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) 
            { 
                ceIschoose.ValueChecked = false; 
                 //如果点击则全部清空,这里的问题是,虽然清空了,但是清空以后就没有只能选5个的限制了,可以选更多,(****要解决的问题:是依然让用户只能选择5个****)
            }         void ceIschoose_EditValueChanging(object sender, ChangingEventArgs e) 
            { 
              
                bool isChoose = (bool)e.NewValue; 
                //这里就不是很明白了,只知道选中某个选择项,这里的isChoose的值就会变为true
                if (isChoose) 
                { 
                    if (!sendSmsFamilyDic.ContainsKey(currentFamily.FamilyId)) 
                        sendSmsFamilyDic.Add(currentFamily.FamilyId, currentFamily); 
                    ///如果选中,而且不包含选中的记录,则增加
                } 
                if(!isChoose) 
                { 
                    if (sendSmsFamilyDic.ContainsKey(currentFamily.FamilyId)) 
                        sendSmsFamilyDic.Remove(currentFamily.FamilyId); 
                    ///如果撤销选中,而且包含选中的记录,则删除
                } 
              
            } void gvCremains_FocusedRowChanged(object sender, FocusedRowChangedEventArgs e) 
            {            
                gvCremains.CollapseAllDetails(); 
                gvCremains.ExpandMasterRow(e.FocusedRowHandle); 
                if (sendSmsFamilyDic.Count >= 5) 
                { 
                    bool isChoose = false; 
                    
                    int handle = e.PrevFocusedRowHandle; 
                     //这个地方实现的功能我就不是很清楚了                DataRow row = gvCremains.GetDataRow(handle);   
                    //出错的地方:错误是指定的转换无效。 
                   isChoose =(bool)row["IsChoose"]; 
                    if (isChoose) 
                    { 
                        colIsChoose.OptionsColumn.AllowEdit = false; 
                        //不允许选择
                    } 
                    else 
                    { 
                        colIsChoose.OptionsColumn.AllowEdit = true; 
                    } 
                } 
                if (sendSmsFamilyDic.Count  < 5) 
                {
                    colIsChoose.OptionsColumn.AllowEdit = true; 
                    //如果选择的数量少于5个,则允许选择
                } 
            }
      

  6.   

    而且,
     当我执行了代码1后,就再也不能执行代码2了。
    代码1:
    void biSendSms_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)  
            {  
                ceIschoose.ValueChecked = false;  
                 //如果点击则全部清空,这里的问题是,虽然清空了,但是清空以后就没有只能选5个的限制了,可以选更多,(****要解决的问题:是依然让用户只能选择5个****) 
            }  
    代码2:
    void gvCremains_FocusedRowChanged(object sender, FocusedRowChangedEventArgs e)  
            {             
                gvCremains.CollapseAllDetails();  
                gvCremains.ExpandMasterRow(e.FocusedRowHandle);  
                if (sendSmsFamilyDic.Count >= 5)  
                {  
                    bool isChoose = false;  
                     
                    int handle = e.PrevFocusedRowHandle;  
                     //这个地方实现的功能我就不是很清楚了                 DataRow row = gvCremains.GetDataRow(handle);    
                    //出错的地方:错误是指定的转换无效。  
                   isChoose =(bool)row["IsChoose"];  
                    if (isChoose)  
                    {  
                        colIsChoose.OptionsColumn.AllowEdit = false;  
                        //不允许选择 
                    }  
                    else  
                    {  
                        colIsChoose.OptionsColumn.AllowEdit = true;  
                    }  
                }  
                if (sendSmsFamilyDic.Count   < 5)  
                { 
                    colIsChoose.OptionsColumn.AllowEdit = true;  
                    //如果选择的数量少于5个,则允许选择 
                }  
            } 
      

  7.   

    我用的是选择GridView控件内嵌套的CheckBox控件 道理跟你的一样。
    用javascript实现吧 以下是例子: <form id="form1" runat="server">
       
        <div>
        <input type="text" value="" id="txtNum" disabled="disabled" />
            <asp:GridView ID="GridView1" runat="server" Width="622px" AutoGenerateColumns="False">
                <Columns>
                    <asp:TemplateField>
                        <ItemTemplate>
                            <asp:CheckBox ID="CheckBox1" runat="server" onclick="javascript:CheckNum(this);" />
                        </ItemTemplate>
                    </asp:TemplateField>
                    <asp:BoundField DataField="recordId" HeaderText="recordId" />
                    <asp:BoundField DataField="username" HeaderText="username" />
                </Columns>
            </asp:GridView>
            <input id="Button1" type="button" value="button" onclick="ChkCancle()" /></div>
         <script type="text/javascript">
            var num=0;
            //获取一共有几条记录可选
            var chkNum=document.getElementById("GridView1").getElementsByTagName("input").length;
            
            //只允许选择5条
            function CheckNum(mySelf)
            {
                var myId=mySelf.id;
                
                if(document.getElementById(myId).Checked==true)
                {
                    document.getElementById(myId).Checked=false;
                    num--;
                }
                else
                {
                    document.getElementById(myId).Checked=true;
                    num++;
                }
                
                document.getElementById("txtNum").value=num; 
                if(num==5)
                {  
                    for(var i=0;i<chkNum;i++)
                    {
                        document.getElementById("GridView1").getElementsByTagName("input").item(i).disabled="disabled";
                    }
                }                    }
            //取消选择
            function ChkCancle()
            {
                for(var i=0;i<chkNum;i++)
                {
                    document.getElementById("GridView1").getElementsByTagName("input").item(i).disabled="";
                }
            }
            
        </script>
        </form>