AD
Administrator
Syncfusion Team
September 8, 2005 02:17 PM UTC
Hi,
Please double check your code in the GridFilterBar.CreateEntries() override.
Here is one more sample that handles this issue.
http://www.syncfusion.com/Support/user/uploads/ForumFilterBarDisplayMember_deee6d37.zip
If this doesn''t help, can you upload a sample showing the problem?
Best regards,
Jay N
AD
Administrator
Syncfusion Team
September 8, 2005 02:51 PM UTC
Here is my code:
using System;
using System.Data;
using Syncfusion.Windows.Forms.Grid;
namespace XXX.CommonGui
{
///
/// Summary description for Class1.
///
public class XXXGridFilterBar : GridFilterBar
{
public override void WireGrid(GridDataBoundGrid grid, GridStyleInfo style)
{
base.WireGrid (grid, style);
if(grid != null)
{
DataTable dt = GetDataTable();
if(dt != null)
{
GridBoundColumnsCollection gbcc;
gbcc = (grid.GridBoundColumns.Count == 0) ? grid.Binder.InternalColumns : grid.GridBoundColumns;
int row = GetFilterRow();
for(int gbcIndex = 0; gbcIndex < gbcc.Count ; ++gbcIndex)
{
string colName = gbcc[gbcIndex].MappingName;
GridStyleInfo style1 = gbcc[gbcIndex].StyleInfo;
if(style1.CellType == "ComboBox"
&& style1.DataSource is DataTable
&& style1.DisplayMember != style1.ValueMember)
{
int col = grid.Binder.NameToColIndex(colName);
DataView dv = new DataView(style1.DataSource as DataTable, "", style1.DisplayMember, DataViewRowState.CurrentRows);
grid[row, col].DataSource = CreateComboUniqueEntries(dv, style1.DisplayMember, style1.ValueMember);
grid[row, col].DisplayMember = style1.DisplayMember;
grid[row, col].ValueMember = style1.ValueMember;
}
}
}
grid.Refresh();
}
}
protected override string GetFilterFromRow(GridDataBoundGrid grid)
{
GridCurrentCell cc = grid.CurrentCell;
int col = cc.ColIndex;
int row = this.GetFilterRow();
cc.ConfirmChanges();
string s = grid[row, col].Text;
if(s.IndexOf("custom") > -1)
return base.GetFilterFromRow(grid);
DataTable dt = this.GetDataTable();
string colName;
string rowFilter = "";
if(cc.IsActive)
cc.Deactivate(false);
if(GridUtil.IsEmpty(s) || s == "(none)")
{
grid[row, col].Text = "";
grid[row, col].Tag = "";
}
else
{
string gridColName = grid.Binder.InternalColumns[grid.Binder.ColIndexToField(col)].MappingName;
colName = dt.Columns[gridColName].ColumnName;
grid[row, col].Text = s;
if (s.IndexOf("''") != -1)
s = s.Replace("''", "''''");
grid[row, col].Tag = string.Format("[{0}] = ''{1}''", colName, s);
}
//otherwise form the filter string from the filter row values
for(int j = 1; j <= grid.Model.ColCount; ++j)
{
s = grid[row, j].Tag as string;
if(s != null && s.Length > 0)
{
if(rowFilter.Length > 0)
rowFilter += " and ";
rowFilter += (string) s;
}
}
return rowFilter;
}
private DataTable CreateComboUniqueEntries(DataView dv, string displayMember, string valueMember)
{
DataTable dt = new DataTable(displayMember);
dt.Columns.Add(new DataColumn(displayMember));
dt.Columns.Add(new DataColumn(valueMember));
DataRow dr = dt.NewRow();
dr[0] = "(none)";
dr[1] = "(none)";
dt.Rows.Add(dr);
string s = "";
for(int i = 0; i < dv.Count; ++i)
{
if(s != dv[i].Row[displayMember].ToString())
{
s = dv[i].Row[displayMember].ToString();
dr = dt.NewRow();
dr[0] = s;
dr[1] = dv[i].Row[valueMember].ToString();
dt.Rows.Add(dr);
}
}
return dt;
}
}
}
--------
and it is called like this:
this.rightLineGrid.BeginUpdate();
if (this.filterBar != null && this.filterBar.Wired)
this.filterBar.UnwireGrid();
/*
Some code
*/
this.filterBar.WireGrid(this.gridDataBoundGrid);
this.rightLineGrid.EndUpdate();
AD
Administrator
Syncfusion Team
September 8, 2005 06:46 PM UTC
I copied your code into the original project, just swapping out the derived filterbar class, and the droplist was not empty in that modified sample for me.
If you place stops in your CreateComboUniqueEntries method, and step through teh code, are the values as expected? If you can upload a sample project, we can try to debug it here.
AD
Administrator
Syncfusion Team
September 13, 2005 08:42 AM UTC
Here''s a demo project that has the problem.
CS_3070.zip
AD
Administrator
Syncfusion Team
September 13, 2005 12:48 PM UTC
Hi,
I couldn''t run your sample, RightLine.xsd was missing in the sample.
Can you please try the following to see if that helps?
In your GridFilterBar.WireGrid() override, clear the cell''s datasource, displaymember and value member before assiging the new one.
public class MyGridFilterBar : GridFilterBar
{
public override void WireGrid(GridDataBoundGrid grid, GridStyleInfo style)
{
//
//
//
if(style1.CellType == "ComboBox"
&& style1.DataSource is DataTable
&& style1.DisplayMember != style1.ValueMember)
{
int col = grid.Binder.NameToColIndex(colName);
DataView dv = new DataView(style1.DataSource as DataTable, "", style1.DisplayMember, DataViewRowState.CurrentRows);
///***Added....
grid[row, col].DataSource = null;
grid[row, col].DisplayMember = null;
grid[row, col].ValueMember = null;
grid[row, col].DataSource = CreateComboUniqueEntries(dv, style1.DisplayMember, style1.ValueMember);
grid[row, col].DisplayMember = style1.DisplayMember;
grid[row, col].ValueMember = style1.ValueMember;
}
}
}
Thanks,
Jay N
AD
Administrator
Syncfusion Team
September 13, 2005 02:16 PM UTC
That solves the problem :-)
Thanks a lot Syncfusion.
mup