Frage

Ich habe versucht, einen benutzerdefinierten Feldtyp zu erstellen. Es handelt sich im Grunde genommen um eine Reihe kaskadierender Dropdowns, bei denen die Werte des zweiten Dropdowns aus einer anderen Liste auf der Grundlage des ausgewählten Wertes im ersten Dropdown -Wert entnommen werden. Ich bin gefolgt Dies Tutorial und basiert auf meinem benutzerdefinierten Feldtyp darauf. Das Problem, das ich habe, ist, dass mein erster Dropdown weigert, (überhaupt) einen Postback zu machen.

Mein Code ist wie folgt:

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);
    }

}

}

Immer wenn ich in der ersten Liste eine Option auswähle, gibt es nein Postback, die Seite aktualisiert nicht (wie sie sollte) und daher wird die ausgewählte Methode nicht geschossen. Ich habe jetzt alles ausprobiert, aber ich kann einfach nicht meinen Dropdown zum Postback bekommen ... Was fehlt mir?

War es hilfreich?

Lösung

Der Grund, warum es nicht funktioniert, ist, dass Sie die Render () -Methode überschreiben. Entfernen Sie diese Überschreibung und fügen Sie Ihren CreateChildControls Folgendes hinzu:

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

Wenn Sie dies tun, werden Ihre Steuerelemente im Steuerbaum registriert und erhalten einen gültigen Kontrollnamen. Diese Registrierung ist erforderlich, um Postbacks wie Sie erwarten zu lassen.

Andere Tipps

Ich habe Ihren Code nicht angesehen, aber ich habe diese Funktionalität zuvor implementiert, damit ich weiß, dass eine funktionierende Version auf Codeplex verfügbar ist, die Sie möglicherweise stattdessen verwenden oder nach Inspiration suchen können: http://cascddlistwithfilter.codeplex.com/

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit sharepoint.stackexchange
scroll top