2016-05-01 7 views
0

Ich habe ein Textfeld, das ich ihren Text veränderndes Ereignis verwalten die RadGrid zu filtern:Filter RadGrid Spalte auf seinen Text Basierend nicht Wert

private void txtJob_TextChanging(object sender, TextChangingEventArgs e) 
{ 
    this.gridCustomers.Columns["JobColumn"].FilterDescriptor = new FilterDescriptor 
    { 
     Operator = FilterOperator.Contains, 
     Value = txtJob.Text 
    }; 
} 

I JobColumn Text mit Cellformatting-Ereignis ändern:

private void gridCustomers_CellFormatting(object sender, CellFormattingEventArgs e) 
{ 
    if (e.Column.Name == "JobColumn") 
     e.CellElement.Text = db.tblJobs.First(x => x.JobID == Convert.ToInt32(e.Row.Cells[9].Value.ToString())).JobName; 
} 

Ich ersetze Job-ID mit seinem Job-Namen in JobColumn, in diesem Textfeld, das ich RadGrid nach Job-Namen filtern, die in RadGrid jetzt sichtbar ist, aber es wird basierend auf Job-ID filtern, die der Standardwert vor ist ersetzen. So wie kann ich eine RadGrid-Spalte basierend auf ihrem Text nicht Wert filtern?

Weitere Informationen Ich bin Bindung eine Tabelle wie diese zu meinen girdview:

int JobID 
nvarchar(10) Name 
nvarchar(100) Address 
. 
. 
. 

Und ich habe eine Tabelle mit dem Namen Jobs wie folgt aus:

int JobID 
nvarchar(30) JobName 
. 
. 
. 

Ich brauche JobID von Tisch zu bekommen Eins und in Datenbindung (Zellenformatierung) ersetzen Sie die ID mit ihrem JobName in der Tabelle Jobs. Warum wähle ich nicht neu und verbinde zwei Tabellen? weil ich in diesem Fall keine Rasteransicht habe, die leicht bearbeitet werden kann, muss ich Virtual Gird verwenden, was nicht mein Ziel ist.

Antwort

1

Sie versuchen, das System zu hacken. Der richtige Ansatz in Ihrem Fall ist die Verwendung von GridVieWComboBoxColumn, die gebunden werden kann und die Angabe von DisplayMember und ValueMember. Es hat auch FilterMode-Eigenschaft, um zu bestimmen, welches Feld für die Filterung verwendet werden soll.

Lesen Sie mehr GridViewComboBoxColumn | Telerik UI for WinForms Documentation

UPDATE

Hier ist ein Beispiel, das Sie

protected override void OnLoad(EventArgs e) 
    { 
     base.OnLoad(e); 

     DataTable mainTable = new DataTable(); 
     mainTable.Columns.Add("JobID", typeof(int)); 
     mainTable.Columns.Add("Name"); 
     mainTable.Columns.Add("Address"); 

     Random rand = new Random(); 
     for (int i = 0; i < 10; i++) 
     { 
      mainTable.Rows.Add(rand.Next(1,4), "Name " + i, "Address " + i); 
     } 

     DataTable jobsTable = new DataTable(); 
     jobsTable.Columns.Add("JobID", typeof(int)); 
     jobsTable.Columns.Add("JobName"); 

     jobsTable.Rows.Add(1, "ABC "); 
     jobsTable.Rows.Add(2, "DFG"); 
     jobsTable.Rows.Add(3, "XCV"); 

     radGridView1 = new RadGridView() { Dock = DockStyle.Fill, AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill }; 
     this.Controls.Add(radGridView1); 
     radGridView1.EnableFiltering = true; 

     radGridView1.DataSource = mainTable; //this will create all columns 

     radGridView1.Columns.Remove(radGridView1.Columns["JobId"]); 

     GridViewComboBoxColumn comboCol = new GridViewComboBoxColumn(); 
     comboCol.DataSource = jobsTable; 
     comboCol.FieldName = "JobID"; //the name of the field in the main table to look for 
     comboCol.DisplayMember = "JobName"; //you want to see job names not ids 
     comboCol.ValueMember = "JobID"; 
     comboCol.FilteringMode = GridViewFilteringMode.DisplayMember; 
     radGridView1.Columns.Insert(0, comboCol); 
    } 

    private void radButton1_Click(object sender, EventArgs e) 
    { 
     radGridView1.Columns["JobID"].FilterDescriptor = new FilterDescriptor 
     { 
      Operator = FilterOperator.Contains, 
      Value = "B" 
     }; 
    } 
+0

Gibt es eine Möglichkeit Benutzerdefinierte Filter zu verwenden, um Zeilen zu filtern basierend auf Zell Texte nicht Werte zu erhalten begonnen? – Nofuzy

+1

nicht ein sauberes für Textbox Spalte – checho

+0

und was ist mit dirty one? – Nofuzy