【问题标题】:RadGrid with custom filters带有自定义过滤器的 RadGrid
【发布时间】:2012-01-04 00:00:51
【问题描述】:

我想要实现的是在使用 NeedDataSource 事件绑定数据的 RadGrid 上使用带有 DropDownList、TextBox 和 CheckBox 等控件的自定义过滤器。

我之前的尝试是这样的:

过滤器工作正常,它使用以下代码过滤掉 RadGrid:

protected void btnSearch_Click(object sender, EventArgs e)
    {
        var kontakti = from k in db.Kontakt
                       select k;

        int idTipUsera = Convert.ToInt32(rcbTipUsera.SelectedValue);
        int idTvrtka = Convert.ToInt32(rcbTvrtka.SelectedValue);

        if (rcbTvrtka.SelectedValue != "0")
        {
            kontakti = kontakti.Where(k => k.idFirma == idTvrtka);
        }

        if (rcbTipUsera.SelectedValue != "0")
        {
            kontakti = kontakti.Where(k => k.idOvlasti == idTipUsera);
        }

        if (chkAktivan.Checked == true)
        {
            kontakti = kontakti.Where(k => k.Aktivan == true);
        }
        else
        {
            kontakti = kontakti.Where(k => k.Aktivan == false);
        }

        int idKontakt = Convert.ToInt32(Request.QueryString["idk"]);
        int idAuthKontakt = Convert.ToInt32(Session["authenticatedUI"]);

        if (idKontakt > 0 && idAuthKontakt == idKontakt)
        {
            gvKontakti.DataSource = from k in kontakti
                                    where k.idKontakt == idKontakt
                                    orderby k.Prezime, k.Ime
                                    select new { Tvrtka = k.Firma.Naziv, k.idKontakt, Naziv = k.Ime + " " + k.Prezime, Funkcija = k.Funkcija, k.Ime, k.Prezime, k.Tel1, k.Tel2, k.Mob1, k.Mob2, k.Email1, k.Email2, k.Fax, k.Adresa1, k.Adresa2, k.Adresa3, k.Grad, k.PostanskiBroj, k.Drzava, k.Biljeske, k.Aktivan, k.Username, k.Password };
        }
        else if (idKontakt > 0 && idAuthKontakt != idKontakt)
        {
            gvKontakti.DataSource = from k in kontakti
                                    where k.idKontakt == idKontakt
                                    orderby k.Prezime, k.Ime
                                    select new { Tvrtka = k.Firma.Naziv, k.idKontakt, Naziv = k.Ime + " " + k.Prezime, Funkcija = k.Funkcija, k.Ime, k.Prezime, k.Tel1, k.Tel2, k.Mob1, k.Mob2, k.Email1, k.Email2, k.Fax, k.Adresa1, k.Adresa2, k.Adresa3, k.Grad, k.PostanskiBroj, k.Drzava, k.Biljeske, k.Aktivan, k.Username, k.Password };
        }
        else
        {
            gvKontakti.DataSource = from k in kontakti
                                    orderby k.Prezime, k.Ime
                                    select new { Tvrtka = k.Firma.Naziv, k.idKontakt, Naziv = k.Ime + " " + k.Prezime, Funkcija = k.Funkcija, k.Ime, k.Prezime, k.Tel1, k.Tel2, k.Mob1, k.Mob2, k.Email1, k.Email2, k.Fax, k.Adresa1, k.Adresa2, k.Adresa3, k.Grad, k.PostanskiBroj, k.Drzava, k.Biljeske, k.Aktivan, k.Username, k.Password };
        }

        gvKontakti.DataBind();
    }

提到的代码的问题是,每当我尝试单击“Detalji”(实际上是标准的编辑按钮)时,都会选择错误的记录。我认为问题出在 Edit 按钮中,我相信该按钮会执行回发,这会导致 NeedDataSource 事件被触发并加载默认 DataSource,然后调用先前选择的行的索引。

我的问题是如何解决这个问题或有什么替代方法?

谢谢!

问候,

赫尔沃耶

【问题讨论】:

    标签: c# asp.net linq-to-entities telerik radgrid


    【解决方案1】:

    好的,我找到了解决方案!

    我所做的是使用 Session 来帮助我们确定过滤后的 RadGrid DataSource 是已启动还是默认的。

        protected void btnSearch_Click(object sender, EventArgs e)
        {
            Session["SearchKontakti"] = "1";
        }
    

    之后我必须使用 if 循环设置 PreRender 以检查前面提到的 Session。

    protected void gvKontakti_PreRender(object sender, EventArgs e)
        {
            int idKontakt = Convert.ToInt32(Request.QueryString["idk"]);
    
            if (Session["SearchKontakti"] == "1")
            {
                var kontakti = from k in db.Kontakt
                               select k;
    
                int idTipUsera = Convert.ToInt32(rcbTipUsera.SelectedValue);
                int idTvrtka = Convert.ToInt32(rcbTvrtka.SelectedValue);
    
                if (rcbTvrtka.SelectedValue != "0")
                {
                    kontakti = kontakti.Where(k => k.idFirma == idTvrtka);
                }
    
                if (rcbTipUsera.SelectedValue != "0")
                {
                    kontakti = kontakti.Where(k => k.idOvlasti == idTipUsera);
                }
    
                if (chkAktivan.Checked == true)
                {
                    kontakti = kontakti.Where(k => k.Aktivan == true);
                }
                else
                {
                    kontakti = kontakti.Where(k => k.Aktivan == false);
                }
    
                int idAuthKontakt = Convert.ToInt32(Session["authenticatedUI"]);
    
                if (idKontakt > 0 && idAuthKontakt == idKontakt)
                {
                    gvKontakti.DataSource = from k in kontakti
                                            where k.idKontakt == idKontakt
                                            orderby k.Prezime, k.Ime
                                            select new { Tvrtka = k.Firma.Naziv, k.idKontakt, Naziv = k.Ime + " " + k.Prezime, Funkcija = k.Funkcija, k.Ime, k.Prezime, k.Tel1, k.Tel2, k.Mob1, k.Mob2, k.Email1, k.Email2, k.Fax, k.Adresa1, k.Adresa2, k.Adresa3, k.Grad, k.PostanskiBroj, k.Drzava, k.Biljeske, k.Aktivan, k.Username, k.Password };
                }
                else if (idKontakt > 0 && idAuthKontakt != idKontakt)
                {
                    gvKontakti.DataSource = from k in kontakti
                                            where k.idKontakt == idKontakt
                                            orderby k.Prezime, k.Ime
                                            select new { Tvrtka = k.Firma.Naziv, k.idKontakt, Naziv = k.Ime + " " + k.Prezime, Funkcija = k.Funkcija, k.Ime, k.Prezime, k.Tel1, k.Tel2, k.Mob1, k.Mob2, k.Email1, k.Email2, k.Fax, k.Adresa1, k.Adresa2, k.Adresa3, k.Grad, k.PostanskiBroj, k.Drzava, k.Biljeske, k.Aktivan, k.Username, k.Password };
                }
                else
                {
                    gvKontakti.DataSource = from k in kontakti
                                            orderby k.Prezime, k.Ime
                                            select new { Tvrtka = k.Firma.Naziv, k.idKontakt, Naziv = k.Ime + " " + k.Prezime, Funkcija = k.Funkcija, k.Ime, k.Prezime, k.Tel1, k.Tel2, k.Mob1, k.Mob2, k.Email1, k.Email2, k.Fax, k.Adresa1, k.Adresa2, k.Adresa3, k.Grad, k.PostanskiBroj, k.Drzava, k.Biljeske, k.Aktivan, k.Username, k.Password };
                }
    
                gvKontakti.DataBind();
            }
        }
    

    我必须做的最后一件事是在重置按钮上重置会话,但这很简单。

    问候,

    赫尔沃耶

    【讨论】:

      猜你喜欢
      • 2011-01-24
      • 2012-04-24
      • 2021-06-21
      • 2018-05-25
      • 2018-11-18
      • 2016-01-23
      • 1970-01-01
      • 1970-01-01
      • 2014-03-25
      相关资源
      最近更新 更多