Question

J'ai essayé de construire un type de champ personnalisé. Il est essentiellement un ensemble de menus déroulants en cascade, où les valeurs de la seconde liste déroulante sont prises d'une autre liste en fonction de la valeur sélectionnée dans la première liste déroulante. J'ai suivi ce tutoriel et basé mon type de champ personnalisé à ce sujet. Le problème que je vais avoir est que ma première liste déroulante refuse de faire un postback (du tout).

Code Ma est comme suit:

using System;
using System.Runtime.InteropServices;

using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;

using System.Web.UI;
using System.Web.UI.WebControls;

 namespace CaesarDropDown
{   
[CLSCompliant(false)]
[Guid("0a876b22-e0c7-4a4e-a434-68c3232266dc")]
public class CeasarDropDownFieldControl : BaseFieldControl
{
    private DropDownList parentList;
    private DropDownList childList;
    private TextBox box;
    private SPDataSource dataSource;
    private SPSite site;

    /// <summary>
    /// Indicate whether our field should be shown as a new section or appended to the end of the preceding section
    /// </summary>
    public bool DisplayAsNewSection
    {
        get
        {
            return true;
        }
    }

    protected override void CreateChildControls()
    {
        base.CreateChildControls();
        site = SPContext.GetContext(this.Context).Site;
        dataSource = new SPDataSource();
        dataSource.List = site.RootWeb.Lists["Categorieën"];

        parentList = new DropDownList();

        this.parentList.SelectedIndexChanged += new EventHandler(parent_SelectedIndexChanged);
        this.parentList.AutoPostBack = true;

        this.parentList.DataSource = dataSource;
        this.parentList.DataTextField = "Title";
        this.parentList.DataValueField = "Categorie";
        this.parentList.DataBind();
        this.parentList.Items.Insert(0, new ListItem("Select", ""));

        this.childList = new DropDownList();
        this.box = new TextBox();
        this.box.Text = this.ControlMode.ToString();
    }

    void parent_SelectedIndexChanged(object sender, EventArgs e)
    {
        EnsureChildControls();

        SPDataSource ds = new SPDataSource();
        ds.List = site.RootWeb.Lists["Applicaties"]; // Temporary, get the correct list from the first dropdown here later
        this.childList.DataSource = ds;
        this.childList.DataBind();
        this.childList.Visible = false;
    }


    public override object Value
    {
        get
        {
            EnsureChildControls();
            return this.parentList.SelectedValue;
        }

        set
        {
            EnsureChildControls();
            this.parentList.SelectedValue = (string)this.ItemFieldValue;
            SPDataSource ds = new SPDataSource();
            ds.List = site.RootWeb.Lists["Applicaties"];                
            this.childList.DataSource = ds;
        }
    }

    protected override bool OnBubbleEvent(object sender, EventArgs e)
    {
        return base.OnBubbleEvent(sender, e);
    }

    protected override void Render(HtmlTextWriter output)
    {           
        this.parentList.RenderControl(output);
        this.childList.RenderControl(output);
        this.box.RenderControl(output);
    }

}

}

Chaque fois que je sélectionne une option dans la première liste, il y a pas postback, la page ne se recharge pas (comme il se doit) et donc la méthode SelectedIndexChanged ne se déclenche pas. J'ai essayé tout, mais je ne peux pas obtenir mon menu déroulant pour postback ... Qu'est-ce que je manque?

Était-ce utile?

La solution

La raison pour laquelle il ne fonctionne pas est que vous surchargez la méthode Render (). Retirez et que override ajouter ce qui suit à vos CreateChildControls:

this.Controls.Add(parentList);
this.Controls.Add(childList);
this.Controls.Add(box);

Si vous le faites alors vos commandes sera enregistré dans l'arbre de commande et d'obtenir un nom de contrôle valide. Cette inscription est nécessaire pour obtenir postbacks au travail comme prévu.

Autres conseils

Je nai regardé votre code, mais je mis en œuvre cette fonctionnalité avant donc je sais Theres une version de travail disponible sur CodePlex que vous pouvez soit utiliser à la place ou chercher l'inspiration dans: http://cascddlistwithfilter.codeplex.com/

Licencié sous: CC-BY-SA avec attribution
Non affilié à sharepoint.stackexchange
scroll top