Datalist等数据控件中嵌套RadioButton并实现单选点击Radiobutton显示对应的类别!Datalist嵌套radiobutton

今天做一个项目想要实现如下效果:

datalist控件中嵌套一个radiobutton(绑定所有行业网站的名称)-------->点击某个行业网站的单选按钮-------->对应的LISTBOX显示(显示该行业网站下面的大类)-------->点击大类---------->对应的LISTBOX显示(某个大类下面的小类别);

 

具体如图:

(这便是要实现的效果!用checkbox可以很轻松的实现,但是用radiobutton就不是那么容易了!)

 

主要代码:

  //这个是Datalist的绑定事件

 protected void DataList1_ItemDataBound(object sender, DataListItemEventArgs e)
    {

        Label cid = (Label)(e.Item.FindControl("cid"));
        RadioButton class1 = (RadioButton)(e.Item.FindControl("class1"));
        [class1.Attributes.Add("onclick", "clickit();");]-----这一句主要是给Radiobutton一个onclick事件(调用Js的clickit()方法主要实现单选的功能)
        cid.Text = DataBinder.Eval(e.Item.DataItem, "id").ToString();
        RequiredFieldValidator r1 = (RequiredFieldValidator)e.Item.FindControl("RequiredFieldValidator1");
        r1.Display = ValidatorDisplay.None;
        RequiredFieldValidator r2 = (RequiredFieldValidator)e.Item.FindControl("RequiredFieldValidator2");
        r2.Display = ValidatorDisplay.None;
    }

//下面这个是radiobutton的select_change事件即点击单选按钮的事件

  

        Response.Write(((RadioButton)sender).NamingContainer.NamingContainer.ClientID + "<br>");
        Response.Write(((RadioButton)sender).NamingContainer.ClientID+"<br>");
        Response.Write(((RadioButton)sender).ClientID + "<br>");
        -----NamingContainer 获取他父级的命名空间容器
        [foreach (Control lc in ((RadioButton)sender).NamingContainer.NamingContainer.Controls)
        {
           
            foreach (Control lac in lc.Controls)
            {
                if (lac is ListBox)
                {
                    ((ListBox)lac).Visible = false;
                }
            }
        }]------这句是主要的至于意思嘛说实话我自己都还不太明白所以上面我用了三个输出,呵呵你用过之后你就会明白是什么意思了!

                   主要目的获取Datalist的id,并循环里面的控件,嵌套一个foreach循环 目的都是为了查找listbox这个控件找到之后让其隐藏

                   我也没搞太懂还要慢慢研究下。。先把重要的先记下来留个参考。。 

    ------晚上研究下了发现上面循环两次滴原因了,Datalist控件生成之后会生成3层标识,第一层:Datalist1 第二层:Datalist1_clt001

                   第三层:Datalist1_clt001_ListBox1   汗死,这样要找到listbox1这个控件就得循环2次。。 
        if (((RadioButton)sender).Checked)
        {
            ListBox l1 = (ListBox)((RadioButton)sender).NamingContainer.FindControl("ListBox1");
            Label cid = (Label)((RadioButton)sender).FindControl("cid");
            l1.Visible = true;
            LoadListBox1(l1, cid.Text);
            RequiredFieldValidator r1 = (RequiredFieldValidator)((RadioButton)sender).NamingContainer.FindControl("RequiredFieldValidator1");
            r1.Display = ValidatorDisplay.Dynamic;
            RequiredFieldValidator r2 = (RequiredFieldValidator)((RadioButton)sender).NamingContainer.FindControl("RequiredFieldValidator2");
            r2.Display = ValidatorDisplay.Dynamic;
        }
        else
        {
            ListBox l1 = (ListBox)((RadioButton)sender).NamingContainer.FindControl("ListBox1");
            ListBox l2 = (ListBox)((RadioButton)sender).NamingContainer.FindControl("ListBox2");
            l1.Visible = false;
            l2.Visible = false;

            RequiredFieldValidator r1 = (RequiredFieldValidator)((RadioButton)sender).NamingContainer.FindControl("RequiredFieldValidator1");
            r1.Display = ValidatorDisplay.None;
            RequiredFieldValidator r2 = (RequiredFieldValidator)((RadioButton)sender).NamingContainer.FindControl("RequiredFieldValidator2");
            r2.Display = ValidatorDisplay.None;
        }

 //实现单选的js

 

<script type="text/javascript">
   
       function clickit() {
        var dom=document.all;
        var dd = document.getElementsByTagName("select");
        var el=event.srcElement;

      
       
        if(el.tagName=="INPUT"&&el.type.toLowerCase()=="radio")
        {
                for(i=0;i<dom.length;i++)
                {
                        if(dom[i].tagName=="INPUT"&&dom[i].type.toLowerCase()=="radio")
                        {
                                dom[i].checked=false; 
                        }
                }
        }
         el.checked=true;
}
    </script>

 

 

 

posted @   迷、踪  阅读(948)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述
点击右上角即可分享
微信分享提示