整容说文库 > 程序代码 > 教育资讯

程序的问题,

来源:学生作业帮助网 编辑:整容说文库 时间:2019/07/17 02:22:37 程序代码
程序的问题,程序代码

同事写的一组代码,现在出了点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;
            }
        }
gvCremains是个什么控件
不懂,只能帮顶了。
引用 1 楼 tianmin200 的回复:
gvCremains是个什么控件


gridview
有人会吗?
该回复于2008-04-21 13:30:20被版主删除
看到程序就头大,你的那个DeveloperExpress.xtraGrid.gridControl是不是自定义控件啊!

在点击BUTTON时为什么不直接遍例gridview的所有行,看选中的行是否大于5,如果不是则报错
最好把注释写上,都不知道哪几个自定义事件是干嘛的
DataRow row = gvCremains.GetDataRow(handle); 

handle参数得是datarow类型的吧  

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

1 用一个集合存放选中的项,重新选择时记得清空;
2 清空可用FindControl遍历一下,checked=false;
 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个,则允许选择
            } 
        }
而且,
 当我执行了代码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个,则允许选择 
            }  
        } 
学习
说的不够清楚吗?
引用 12 楼 changjiangzhibin 的回复:
1 用一个集合存放选中的项,重新选择时记得清空; 
2 清空可用FindControl遍历一下,checked=false;

 具体怎么做?
引用 17 楼 dlzhangln 的回复:

 什么地方看不清楚?
我用的是选择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>
再顶顶看~1
 问题还没有解决,越看问题越多~!
程序代码