2016-05-08 2 views
1

Как отфильтровать список из списка выбора combobox.Фильтрация списка из SQL Server при выборе combobox

Если пользователь выбирает элементы 5*108 в выпадающем списке, то в виде списка будут показаны все элементы, которые имеют, что 5*108 в нем, который находится в P.krydsmål

C#

 public partial class MainWindow : Window, INotifyPropertyChanged 
{ 

    public SqlConnection conn; 
    public SqlCommand cmd; 
    string connStrings = ConfigurationManager.AppSettings["Sql"]; 
    string Data = @"Select ps.Mærket AS Mærke, P.DataID, P.Billed, P.Model, P.Årgang, P.[Motor Type], P.Krydsmål, P.Centerhul, P.ET,P.Bolter, P.Dæk, P.Fælge ,PS.Krydsmålene from Data.Hjuldata P inner join Data.Mærke PS on P.MærkeID = PS.MærkeID ORDER BY ps.Mærket"; 
    public event PropertyChangedEventHandler PropertyChanged; 
    private string _selectedParam; 
    public MainWindow() 
    { 
     InitializeComponent(); 
BindData() 
ICollectionView dataView = CollectionViewSource.GetDefaultView(hjuldata.ItemsSource); 
      dataView.GroupDescriptions.Add(new PropertyGroupDescription("Mærke")); 

    } 
    private void NotifyPropertyChanged(String info) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(info)); 
     } 
    } 
    public string SelectedParam { get { return _selectedParam; } set { _selectedParam = value; NotifyPropertyChanged("SelectedParam"); if (_selectedParam == "ingen") { BindData(); } else { hjuldata.ItemsSource = FilterKategori().Tables[0].DefaultView; ; } } } 
    private void BindData() 
    { 
     hjuldata.ItemsSource = kategori().Tables[0].DefaultView; 

    } 
    public DataSet kategori() 
    { 
     //SQL statement to fetch entries from Hjuldata 
     DataSet dsdata = new DataSet(); 

     //Open SQL Connection 
     using (conn = new SqlConnection(connStrings)) 
     { 
      conn.Open(); 

      //Initialize command object 
      using (conn = new SqlConnection(connStrings)) 
      using (SqlCommand cmd = new SqlCommand(Data, conn)) 
      {     
       SqlDataAdapter adapters = new SqlDataAdapter(cmd); 

       //Fill the result set 
       adapters.Fill(dsdata); 
       conn.Close(); 
      } 
     } 
     return dsdata; 
    } 
    public DataSet FilterKategori() 
    { 

    string Data = @"Select ps.Mærket AS Mærke, P.DataID, P.Billed, P.Model, 
P.Årgang, P.[Motor Type], P.Krydsmål, P.Centerhul, P.ET,P.Bolter, 
P.Dæk, P.Fælge ,PS.Krydsmålene from Data.Hjuldata P 
inner join Data.Mærke PS on P.MærkeID = PS.MærkeID 
WHERE Krydsmål = @param1";//only works with '5*108' 





//SQL statement to fetch entries from products 
      DataSet dsdata = new DataSet(); 

      //Open SQL Connection 
      using (conn = new SqlConnection(connStrings)) 
      { 
       conn.Open(); 

       //Initialize command object 
       using (SqlCommand cmds = new SqlCommand(Data, conn)) 
       { 
        cmds.Parameters.AddWithValue("@param1", SelectedParam); 
        SqlDataAdapter adapters = new SqlDataAdapter(cmds); 
        //Fill the result set 
        adapters.Fill(dsdata); 
       } 

      } 
      return dsdata; 
     } 

Combobox

<ComboBox x:Name="comboBox_Copy" Width="150" Height="40" Foreground="#FF00FB0B" Background="#FF303030" FontSize="16" Canvas.Left="1030" Canvas.Top="24" Style="{StaticResource ComboBoxTest2}" SelectedItem = "{Binding SelectedParam, ElementName=win, UpdateSourceTrigger=PropertyChanged}"> 
         <ComboBoxItem Content="Ingen"/> 
         <ComboBoxItem Content="3x98"/> 
         <ComboBoxItem Content="3x112"/> 
         <ComboBoxItem Content="4x98"/> 
         <ComboBoxItem Content="4x100"/> 
         <ComboBoxItem Content="4x108"/> 
         <ComboBoxItem Content="4x114.3"/> 
         <ComboBoxItem Content="4x160"/> 
         <ComboBoxItem Content="5x98"/> 
         <ComboBoxItem Content="5x100"/> 
         <ComboBoxItem Content="5x108"/> 

ответ

1

Теперь вы показали значение отладки SelectedParam, я получил эту проблему. Проблема в combobox. Ваше поле со списком должно быть примерно таким:

<ComboBox x:Name="comboBox_Copy" Width="150" Height="40" Foreground="#FF00FB0B" Background="#FF303030" FontSize="16" 
     SelectedValuePath="Content" 
     SelectedValue = "{Binding SelectedParam, ElementName=win, UpdateSourceTrigger=PropertyChanged}"> 
      <ComboBoxItem Content="Ingen"/> 
      <ComboBoxItem Content="3x98"/> 
      <ComboBoxItem Content="3x112"/> 
      <ComboBoxItem Content="4x98"/> 
      <ComboBoxItem Content="4x100"/> 
      <ComboBoxItem Content="4x108"/> 
      <ComboBoxItem Content="4x114.3"/> 
      <ComboBoxItem Content="4x160"/> 
      <ComboBoxItem Content="5x98"/> 
      <ComboBoxItem Content="5x100"/> 
      <ComboBoxItem Content="5x108"/> 

</ComboBox> 

Обратите внимание на SelectedValuePath. Это отправит в SelectedParam строку, а не объект ComboBoxItem.

Смотреть демо в моем GitHub: DemoCombo

Пожалуйста, обратите внимание на имена, мое может отличаться от твоего ...

+0

thats работал так что теперь мне просто нужно выяснить, как заставить группу работать с этим, но по крайней мере он решил мой вопрос –

+0

это дает мне это, когда я пытаюсь сгруппировать Исключение брошено: 'System.Data.SqlClient.SqlException' в System.Data.dll Дополнительная информация: Параметрированный запрос '(@ param1 nvarchar (4000)) Выберите ps.Mærket AS Mærke, P.DataID, PB 'ожидает параметр' @ param1 ', который не был предоставлен. –

+0

этот messagem 'ожидает параметр' @ param1 ', который не был указан' говорит, что у вас есть параметр, определенный в вашем SQL-предложении, но вы не указали для него значение. – quicoli

3

Я бы рекомендовал использовать шаблон MVVM, чтобы облегчить вам задачу. Но, как вы используете код позади:

1- Реализовать INotifyPropertyChanged на вашем окне:

public class MainWindow: Window, INotifyPropertyChanged 
{ 
    //Existing code.... 


    public event PropertyChangedEventHandler PropertyChanged; 

    private void NotifyPropertyChanged(String info) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(info)); 
     } 
    } 
} 

2 - Определить свойство, представляющее выбранный элемент в вас COMBOBOX и в инкубаторе, вы можете запустить свой метод фильтра :

private string _selectedParam; 
public string SelectedParam 
{ 
    get{return _selectedParam;} 
    set 
    { 
    _selectedParam = value; 
    NotifyPropertyChanged("SelectedParam"); 
    hjuldata.ItemsSource = FilterKategori(_selectedParam).Tables[0].DefaultView; 

    } 
} 

3 - Bind ComboBox SelectedItem к вашей новой собственности:

<ComboBox x:Name="comboBox_Copy" 
      SelectedItem = "{Binding SelectedParam, ElementName=YourWindowsName, UpdateSourceTrigger=PropertyChanged}" 
      Width="150" Height="40" 
      Foreground="#FF00FB0B" Background="#FF303030" FontSize="16" 
      Canvas.Left="1030" Canvas.Top="24"> 
    <ComboBox.Resources> 
     <SolidColorBrush x:Key="{x:Static SystemColors.WindowBrushKey}" Color="#FF303030" /> 
    </ComboBox.Resources> 
    <ComboBoxItem Content="Ingen"/> 
    <ComboBoxItem Content="3*98"/> 
    <ComboBoxItem Content="3*112"/> 
</ComboBox> 

4 - Создать FilterKategori

public DataSet FilterKategori() 
{ 

string Data = @"SELECT [DataID], [MærkeID], [Billed], [Model], [Årgang], [Motor Type], [Krydsmål], [Centerhul], 
    [ET], [Møtrikker], [Bolter], [Dæk], [Fælge] 
FROM 
    [OminiData].[Data].[Hjuldata] 
WHERE 
    Krydsmål = @param1"; 

//SQL statement to fetch entries from products 
DataSet dsdata = new DataSet(); 

//Open SQL Connection 
using (SqlConnection conns = new SqlConnection(connStrings)) 
{ 
conns.Open(); 

//Initialize command object 
using (SqlCommand cmds = new SqlCommand(Data, conns)) 
{ 
    cmds.Parameters.AddWithValue("@param1", SelectedParam); 
    SqlDataAdapter adapters = new SqlDataAdapter(cmds); 
    //Fill the result set 
    adapters.Fill(dsdata); 
} 

}  
return dsdata; 
} 
+0

кажется, что может быть решение, как я делаю это, когда ingen chosed, тогда он будет отображать все элементы, а не фильтровать его, а что касается множественной фильтрации, если я еще не буду фильтровать его из другого combobox. –

+0

«Ingen» означает «все»? Хорошо. Просто убедитесь, что был выбран: общественная строка SelectedParam { прибудете {вернуться _selectedParam} набор { _selectedParam = значение; NotifyPropertyChanged ("SelectedParam"); if (_selectedParam == "ingen") { BindData(); } else { hjuldata.ItemsSource = FilterKategori (_selectedParam). Таблицы [0].Вид по умолчанию; } } } – quicoli

+0

Теперь, о фильтрации даже для, вы можете использовать тот же принцип – quicoli

Смежные вопросы