RadGrid带有自定义过滤器

时间:2012-01-04 00:00:52

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

我想要实现的是使用自定义过滤器和RadGrid上的DropDownList,TextBox和CheckBox等控件,它们使用NeedDataSource事件来绑定数据。

我之前尝试的做法是这样的:

enter image description here

过滤器工作正常,它使用以下代码过滤掉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" (这实际上是标准的编辑按钮)选择了错误的记录。我认为问题出现在编辑按钮中,正如我所认为的那样,导致NeedDataSource事件被触发的回发并加载默认的DataSource,然后调用先前选择的行的索引。

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

谢谢!

此致

赫尔沃耶

1 个答案:

答案 0 :(得分:0)

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

我所做的是使用会话,这将有助于我们稍后确定过滤后的RadGrid数据源是否已启动或是默认的。

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

之后我不得不将PreRender设置为if循环以检查之前提到的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();
        }
    }

我要做的最后一件事是重置按钮重置按钮,但这很简单。

此致

赫尔沃耶