如何处理在文本框中输入的多个数据类型值以进行搜索
How to handle the Multiple datatype values entered in a textbox for searching purpose
下面是 Xaml 代码,其中我们有一个组合框,其中包含数据库列名称(硬编码)。接下来,有一个文本框,它将在该 ComboBox Selected 类型值下获取要搜索的值。
Xaml代码
<StackPanel Orientation="Horizontal">
<Label Content="Search By" Width="100"/>
<ComboBox Name="CmbSearch" Width="100" ItemsSource="{Binding ColNames}" SelectedValue="{Binding SearchBy}"/>
</StackPanel>
<StackPanel Orientation="Horizontal">
<Label Content="Enter the Value" Width="100"/>
<TextBox Name="T" Style="{StaticResource Txt}" Text="{Binding Searching,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}"/>
</StackPanel>
<DataGrid Name="DG" ItemsSource="{Binding customer}" SelectedItem="{Binding SelectedCustomer}" AutoGenerateColumns="False" CanUserAddRows="False"
Height="310" Width="310" Margin="10" HorizontalAlignment="Right" CanUserDeleteRows="True">
<DataGrid.Columns>
<DataGridTextColumn Header="Id" Binding="{Binding Path='Id',UpdateSourceTrigger=PropertyChanged}" IsReadOnly="True"/>
<DataGridTextColumn Header="Name" Binding="{Binding Path='Name',UpdateSourceTrigger=PropertyChanged}" IsReadOnly="True" />
<DataGridTextColumn Header="Age" Binding="{Binding Path='Age',UpdateSourceTrigger=PropertyChanged}" IsReadOnly="True" />
<DataGridTextColumn Header="Country" Binding="{Binding Path='Country',UpdateSourceTrigger=PropertyChanged}" IsReadOnly="True" />
<DataGridCheckBoxColumn Header="Active" Binding="{Binding Path='Active',UpdateSourceTrigger=PropertyChanged,Converter={StaticResource convert}}" IsReadOnly="True"/>
<DataGridTemplateColumn Header="Delete Record" IsReadOnly="True">
<DataGridTemplateColumn.CellTemplate >
<DataTemplate>
<Button Command="{Binding DataContext.CmdDeleteUser, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" CommandParameter="{Binding}" Width="60" Margin="2" Content="Delete" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
ViewModel
private string _SearchBy;
public string SearchBy
{
get { return _SearchBy; }
set { _SearchBy = value;
OnPropertyChange("SearchBy");
}
}
private string _Searching;
public string Searching
{
get { return _Searching; }
set
{
_Searching = value;
OnPropertyChange("Searching");
if (Searching != null)
{
collectionView.Filter = new Predicate<Object>(Search);
}
}
}
private bool Search(Object obj)
{
Customer cus = (Customer)obj;
if((SearchBy.Equals("ID")))
{
if (cus.Id.Equals(Convert.ToInt32(Searching)))
{
return true;
}
else
{
return false;
}
}
else if(SearchBy.Equals("Name"))
{
if (cus.Name.Contains(Searching))
{
return true;
}
else
{
return false;
}
}
else if(SearchBy.Equals("Age"))
{
if (cus.Age.Equals(Convert.ToInt32(Searching)))
{
return true;
}
else
{
return false;
}
}
else if(SearchBy.Equals("Country"))
{
if (cus.Country.Contains(Searching))
{
return true;
}
else
{
return false;
}
}
else if(SearchBy.Equals("Active"))
{
if (cus.Active.Equals(Convert.ToBoolean(Searching)))
{
return true;
}
else
{
return false;
}
}
else
{
return false;
}
}
姓名和国家/地区搜索工作正常,但 ID、年龄和活跃度存在类型问题。我还为 Active(它是一个组合框)创建了一个 IValueconverter。另一种应该怎么办?
您可以使用 int.TryParse
方法尝试解析字符串值,然后调用 Equals
.
您应该使用 switch
语句。你的 Search
方法可以这样实现:
private bool Search(Object obj)
{
Customer cus = (Customer)obj;
switch (_SearchBy)
{
case "ID":
return int.TryParse(_Searching, out int id) && cus.Id.Equals(id);
case "Name":
return cus.Name.Contains(Searching);
case "Age":
return int.TryParse(_Searching, out int age) && cus.Age.Equals(age);
case "Country":
return cus.Country.Contains(Searching);
}
return false;
}
下面是 Xaml 代码,其中我们有一个组合框,其中包含数据库列名称(硬编码)。接下来,有一个文本框,它将在该 ComboBox Selected 类型值下获取要搜索的值。 Xaml代码
<StackPanel Orientation="Horizontal">
<Label Content="Search By" Width="100"/>
<ComboBox Name="CmbSearch" Width="100" ItemsSource="{Binding ColNames}" SelectedValue="{Binding SearchBy}"/>
</StackPanel>
<StackPanel Orientation="Horizontal">
<Label Content="Enter the Value" Width="100"/>
<TextBox Name="T" Style="{StaticResource Txt}" Text="{Binding Searching,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}"/>
</StackPanel>
<DataGrid Name="DG" ItemsSource="{Binding customer}" SelectedItem="{Binding SelectedCustomer}" AutoGenerateColumns="False" CanUserAddRows="False"
Height="310" Width="310" Margin="10" HorizontalAlignment="Right" CanUserDeleteRows="True">
<DataGrid.Columns>
<DataGridTextColumn Header="Id" Binding="{Binding Path='Id',UpdateSourceTrigger=PropertyChanged}" IsReadOnly="True"/>
<DataGridTextColumn Header="Name" Binding="{Binding Path='Name',UpdateSourceTrigger=PropertyChanged}" IsReadOnly="True" />
<DataGridTextColumn Header="Age" Binding="{Binding Path='Age',UpdateSourceTrigger=PropertyChanged}" IsReadOnly="True" />
<DataGridTextColumn Header="Country" Binding="{Binding Path='Country',UpdateSourceTrigger=PropertyChanged}" IsReadOnly="True" />
<DataGridCheckBoxColumn Header="Active" Binding="{Binding Path='Active',UpdateSourceTrigger=PropertyChanged,Converter={StaticResource convert}}" IsReadOnly="True"/>
<DataGridTemplateColumn Header="Delete Record" IsReadOnly="True">
<DataGridTemplateColumn.CellTemplate >
<DataTemplate>
<Button Command="{Binding DataContext.CmdDeleteUser, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" CommandParameter="{Binding}" Width="60" Margin="2" Content="Delete" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
ViewModel
private string _SearchBy;
public string SearchBy
{
get { return _SearchBy; }
set { _SearchBy = value;
OnPropertyChange("SearchBy");
}
}
private string _Searching;
public string Searching
{
get { return _Searching; }
set
{
_Searching = value;
OnPropertyChange("Searching");
if (Searching != null)
{
collectionView.Filter = new Predicate<Object>(Search);
}
}
}
private bool Search(Object obj)
{
Customer cus = (Customer)obj;
if((SearchBy.Equals("ID")))
{
if (cus.Id.Equals(Convert.ToInt32(Searching)))
{
return true;
}
else
{
return false;
}
}
else if(SearchBy.Equals("Name"))
{
if (cus.Name.Contains(Searching))
{
return true;
}
else
{
return false;
}
}
else if(SearchBy.Equals("Age"))
{
if (cus.Age.Equals(Convert.ToInt32(Searching)))
{
return true;
}
else
{
return false;
}
}
else if(SearchBy.Equals("Country"))
{
if (cus.Country.Contains(Searching))
{
return true;
}
else
{
return false;
}
}
else if(SearchBy.Equals("Active"))
{
if (cus.Active.Equals(Convert.ToBoolean(Searching)))
{
return true;
}
else
{
return false;
}
}
else
{
return false;
}
}
姓名和国家/地区搜索工作正常,但 ID、年龄和活跃度存在类型问题。我还为 Active(它是一个组合框)创建了一个 IValueconverter。另一种应该怎么办?
您可以使用 int.TryParse
方法尝试解析字符串值,然后调用 Equals
.
您应该使用 switch
语句。你的 Search
方法可以这样实现:
private bool Search(Object obj)
{
Customer cus = (Customer)obj;
switch (_SearchBy)
{
case "ID":
return int.TryParse(_Searching, out int id) && cus.Id.Equals(id);
case "Name":
return cus.Name.Contains(Searching);
case "Age":
return int.TryParse(_Searching, out int age) && cus.Age.Equals(age);
case "Country":
return cus.Country.Contains(Searching);
}
return false;
}