UpdatePanel + Repeater + CheckBox

cavalero
Дата: 25.03.2010 14:03:13
Добрый день!
Провел уже кучу времени с UpdatePanel и Repeater-ом с чекбоксами.
Кода такой
<asp:UpdatePanel ID="up5" runat="server" UpdateMode="Conditional">
    <ContentTemplate>
                        <asp:DropDownList 
                        ID="ddl_folders" 
                        runat="server" 
                        DataSourceID="f_list" 
                        Width="500" 
                        DataTextField="title" 
                        DataValueField="id" 
                        AutoPostBack="true" OnSelectedIndexChanged="ddl_folders_action" >
                        </asp:DropDownList>                    


                                       <asp:Repeater ID="r_flist" runat="server" DataMember="id">
                                       <HeaderTemplate><h3>Files in Folder</h3></HeaderTemplate>
                                            <ItemTemplate>
                                            <div  style="float:left; width:600px;">
                                            <div style="float:left; width:50px; height:50px;"><img width="50" height="50" src='/images/icons/file.png' alt='<%#Eval("FileType") %>'></div>
                                                <div><asp:CheckBox runat="server" ID="fileid" Text='<%#" <b>" + Eval("Name_Of_File") + "</b>" %>' />, <%#(int)Eval("FileSize")/1024 %> kb.</div>
                                                <div><%#Eval("File_Description") %></div>
                                            </div>
                                               <div style='clear:both; border-bottom:solid 1px black; margin-top:10px; margin-bottom:5px;'></div>
                                            </ItemTemplate>
                                        </asp:Repeater>

                    <asp:Button runat="server" ID="btnCancel" OnClick="doCancel" Text="<%$ Resources:CMS_News_List, SectionsButtonCancel%>" Width="80"/> 
                    <asp:Button runat="server" ValidationGroup="vg" ID="btnSave" OnClick="doSave" Text="<%$ Resources:CMS_News_List, SectionsButtonSave%>" Width="80"/>

 </ContentTemplate>
</asp:UpdatePanel>
Code Behind
cavalero
Дата: 25.03.2010 14:03:55
Сорри, случайно нажал "опубликовать", сейчас допишу продолжение.
cavalero
Дата: 25.03.2010 14:08:08
Code Behind

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            DataTable dt = Sections.GetSection(1, RequestHelper.QuerystringInt("ItemID", 0));
            foreach (DataRow dr in dt.Rows)
            {
                XmlDocument xmldoc = new XmlDocument();
                xmldoc.LoadXml(dr["SectionSettings"].ToString());
                XmlNode node = xmldoc.SelectSingleNode("params/FolderID");
                if (node != null)
                {
                    ((DropDownList)this.FindControl("ddl_folders")).SelectedValue = node.InnerText;
                    setFileList(int.Parse(node.InnerText));
                }
            }
        }
        else
        {
            return;
         //setFileList(int.Parse(((DropDownList)this.FindControl("ddl_folders")).SelectedValue));
        }
    }

    protected void setFileList(int id)
    {
        r_flist.DataSource = Files.GetFiles(id, "");
        r_flist.DataBind();
        up5.Update();

    }


    protected void doSave(object sender, EventArgs e)
    {
        XmlElement xe;
        XmlNode xn;
        XmlDocument xmldoc = new XmlDocument();
        string xml = "<params></params>";
        xmldoc.LoadXml(xml);
        XmlDeclaration xmldecl = xmldoc.CreateXmlDeclaration("1.0", "utf-16", null);
        XmlElement root = xmldoc.DocumentElement;
        xmldoc.InsertBefore(xmldecl, root);


        xn = xmldoc.CreateNode("element", "FolderTitle", null);
        xn.InnerText = ((DropDownList)this.FindControl("ddl_folders")).SelectedItem.Text;
        xmldoc.DocumentElement.AppendChild(xn);

        xn = xmldoc.CreateNode("element", "FolderID", null);
        xn.InnerText = ((DropDownList)this.FindControl("ddl_folders")).SelectedItem.Value;
        xmldoc.DocumentElement.AppendChild(xn);

        CheckBox cb;

        foreach (RepeaterItem item in ((Repeater)this.FindControl("r_flist")).Items)
        {

            DataRowView row = (DataRowView)item.DataItem;
            cb = (CheckBox)item.FindControl("fileid");
            if (cb.Checked)
            {
                Response.Redirect("!!!!");
                xn = xmldoc.CreateNode("element", "fileid", null);
                xn.InnerText = "1";
                xmldoc.DocumentElement.AppendChild(xn);
            }
        }
    }


    protected void ddl_folders_action(object sender, EventArgs e)
    {
        setFileList(int.Parse(((DropDownList)sender).SelectedItem.Value));  
    }



Так вот, проблема с чекбоксами. Они упорно не хотят сохранять свое знаечение, т.е. при постбэке чекед ли они, или не чекед, метод doSave всё равно считает, что они не чекед. Я понимаю, что проблема с циклом жизни страницы и разным временем генерации и датабиндинга контролов, но где именно -- найти не могу. Может у кого-то есть идеи?

Спасибо, всех хорошего дня.
SanSYS
Дата: 27.03.2010 09:59:29
тема бояниста, и думаю многие с ней встречались, есть 2 пути решения:
1. на пейджлоаде все же повторно сбиндить список (изврат, и не факт что сработает, в основном с гридом такое помогает)
2. была такая трабла, решил быстро: генерил инпуты с одними неймами + поствикс - номер строки рипитера. на обработчике - бегал по реквесту и читал инпуты. переделывать - минуту, не больше думаю

блог обо всем что посчитал полезным