我需要帮助我的这部分代码。我想在这里做两件事:
第一,我需要我的comboBox cmbTechSearch填充从SQL数据库中检索的名称列表。这些名称属于名为Tecnico的对象。 到现在为止还挺好。但是,如果我两次点击comboBox,我会得到重复的名称......依此类推。 添加cmbTechSearch.Items.Clear();没有解决它,因为该框是数据绑定,触发错误消息。所以我添加了cmbTechSearch.DataSource = null;这解决了错误信息但没有清除我的方框。也没有cmbTechSearch.ResetText(); 现在我不确定如何清除它,以便在我再次点击该框时数据不会重复。
第二,从SQL数据库中检索的列表带来的不仅仅是附加的名称。它也为每个对象带来了一封电子邮件。我无法弄清楚如何检索与该comboBox上所选名称相关联的邮件。 请注意,电子邮件是全局字符串var,因为我在代码中的其他方法中使用它。该部分被评论,因为它不起作用。
public void TechSearch_loaded(object sender,EventArgs e)
{
//所有这3个条目都应该清除comboBox cmbTechSearch;所有这些都失败但是如果我删除了第一行我得到一个错误,说已经有一些数据绑定到该框(但只有当我点击第二次)
cmbTechSearch.DataSource = null;
cmbTechSearch.Items.Clear();
cmbTechSearch.ResetText();
//有一个名为Tecnico的类,有关该对象的所有信息都保存在SQL数据库中。此部分使用db。
中的信息填充Tecnicos列表 List<Tecnico> tecnicos = new List<Tecnico>();
tecnicos = bd.ProcuraPerfisTipo("TEC");
//然后我得到一个Tecnicos列表并为列表中的每个tecnico检索一个属性(Nome)
List<String> TechSearch = new List<String>();
foreach (Tecnico obj in tecnicos)
{
TechSearch.Add(obj.Nome);
}
//最后我使用从列表中获取的信息填充comboBox。
cmbTechSearch.DataSource = TechSearch;
//email = cmbTechSearch.ToString();
}
有一个名为Tecnico的类,另一个名为BDTicketSQL,另一个名为iBDTicketSQL(第一个调用SQL db并运行更新,查询和插入,而第二个用于接口)。这些类都是这种形式的外部。我只是从他们那里得到日期,用我需要的任何信息填充表格。
答案 0 :(得分:0)
好吧,你需要减少你的努力DataBinding
。既然你已经在你的问题中提到过数据绑定,我会假设你知道它。所以我会快速完成答案。此外,由于您没有提到任何平台,我认为它是WPF
,但如果您愿意,可以将代码复制到WinRT或UWP。只是想要它是一个不同的平台,请在评论部分Link to full solution In case you wana skip
你的XAML: 我已经使用基本绑定到代码隐藏来避免样本的很多类。下面是代码:
<StackPanel Margin="20">
<ComboBox x:Name="UserCombobox"
Height="20"
Width="300"
ItemsSource="{Binding DataFromSQLService,Mode=OneWay}"
SelectedItem="{Binding CurrentSelectedUser,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
ItemTemplate="{StaticResource UserDataTemplate}"
SelectionChanged="UserCombobox_SelectionChanged"/>
<Button Content="Clear Combo" Height="30" Width="100" Margin="10" Click="ClearData"/>
<Button Content="Load Combo" Height="30" Width="100" Margin="10" Click="LoadData"/>
<TextBlock Text="{Binding CurrentSelectedUser.Name,Mode=OneWay}" HorizontalAlignment="Center"/>
<TextBlock Text="{Binding CurrentSelectedUser.Email,Mode=OneWay}" HorizontalAlignment="Center"/>
</StackPanel>
现在,您的Window.Resources
将dataTemplate
放在您的组合框项目中。
<Window.Resources>
<DataTemplate x:Key="UserDataTemplate">
<StackPanel>
<TextBlock Text="{Binding Name}"/>
</StackPanel>
</DataTemplate>
</Window.Resources>
现在,将视图自我绑定到它的代码隐藏,因此在Window Declaration中添加
DataContext = "{Binding RelativeSource={RelativeSource Self}}"
现在视图已准备就绪,让我们快速准备好我们的代码。
虚拟用户类您可以将其替换为您的模型类。
public class MyDummyUser
{
public MyDummyUser(string name, string email)
{
Name = name;
Email = email;
}
public string Name { get; set; }
public string Email { get; set; }
}
现在创建一个快速属性来保留当前选定的用户。
private MyDummyUser currentSelectedUser;
public MyDummyUser CurrentSelectedUser
{
get { return currentSelectedUser; }
set { currentSelectedUser = value; RaisePropertyChanged(nameof(CurrentSelectedUser)); }
}
现在创建一个可观察的集合来保存SQL服务中的数据:
private ObservableCollection<MyDummyUser> dataFromSQLService;
public ObservableCollection<MyDummyUser> DataFromSQLService
{
get { return dataFromSQLService; }
set { dataFromSQLService = value; RaisePropertyChanged(nameof(DataFromSQLService)); }
}
现在实施INotifyPropertyChanged
public event PropertyChangedEventHandler PropertyChanged;
public void RaisePropertyChanged(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
//if using c# 6.0 or later replace the above with
//public void RaisePropertyChanged(string propertyName)=>
// PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
现在为combobox.SelectionChanged
事件添加一个侦听器,以便您知道所选用户何时更改:
private void UserCombobox_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
{
if (CurrentSelectedUser != null && !string.IsNullOrEmpty(CurrentSelectedUser?.Email?.Trim()))
{
//perform what you wana do with the email.
}
}
创建两个方法:LoadData和ClearData。
private void ClearData(object sender, RoutedEventArgs e)
{
DataFromSQLService = null;
}
private void LoadData(object sender, RoutedEventArgs e)
{
List<MyDummyUser> someData = new List<MyDummyUser>()
{
new MyDummyUser("User 1","User1@gmail.com"),
new MyDummyUser("User 2","User2@gmail.com"),
new MyDummyUser("User 3","User3@gmail.com"),
new MyDummyUser("User 4","User4@gmail.com"),
new MyDummyUser("User 5","User5@gmail.com"),
new MyDummyUser("User 6","User6@gmail.com"),
};
DataFromSQLService = new ObservableCollection<MyDummyUser>(someData);
}
请注意我使用了WPF
的示例,但即使您想使用WinRT或UWP的代码也能正常工作,请记住切换{{1同时使用Window.Resources
,在UWP中,您可以使用Page.Resources
并使用x:Bind可以帮助您摆脱x:Bind