代码之家  ›  专栏  ›  技术社区  ›  Psytronic

为列表框实现web部件个性化的正确方法

  •  0
  • Psytronic  · 技术社区  · 15 年前

    尝试解决整个web部件的个性化,并尝试将其实现为一个列表框。

    最终结果将是两个列表框,具有可互换的值(即,一个值将只存在于其中一个列表框中)

    但我不能为它维护数据源。所以也许我做错了?

    这是我在页面上测试H2标签的内容

    [Personalizable(PersonalizationScope.User)]
    public string LabelText {
        get { return h2Test.InnerText; }
        set { h2Test.InnerText = value; }
    }
    

    如果我有一个文本框,用它来改变LabelText的值,那么当我关闭浏览器时,它会自动保持这个改变。

    所以我想,好吧,也许同样的方法也适用于列表框

    [Personalizable(PersonalizationScope.User)]
    public DomainList Domains {
        get { return (DomainList)lstBxDomains.DataSource; }
        set {
            lstBxDomains.DataSource = value;
            lstBxDomains.DataBind();
        }
    }
    

    其中DomainList只是一个扩展List的类,Domain只是一个三字段类,int,string,string。

    但事实并非如此,所以这对于Web部件个性化automagican来说是太复杂了,还是我只是错误地实现了它(这很有可能)

    protected void btnRemDomain_Click(object sender, EventArgs e) {
        if (IsPostBack && lstBxDomains.SelectedIndex > -1) {
            for (int i = 0; i < lstBxDomains.Items.Count; i++) {
                if (lstBxDomains.Items[i].Selected) {
                    Domains.Remove(Domains.Find(d => d.ID.ToString() == lstBxDomains.Items[i].Value));
                }
            }
            Domains = Domains;
        }
    }
    

    域=域;这行的作用是查看显式设置值是否产生了影响(因为删除并不能真正重置字段的值),但事实并非如此。我还尝试创建一个新的本地域列表,将其设置为全局域列表,然后对其执行remove/find操作,然后将本地域列表设置为全局域列表。但也不行。

    1 回复  |  直到 15 年前
        1
  •  0
  •   Psytronic    15 年前

    我通过使用 WebPart.SetPersonalizationDirty(this); 在域的访问器集合中,但是是否有人介意确认这是否是一种合适的方法?