- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
更新:我在完全测试之前检查了答案它仍然不起作用。我更新了下面的代码,这样您就可以粘贴到一个空的 WinForms 项目中,它应该可以编译。
更新:我发现,如果我将 ComboBox 上的选定项目更改为任何其他项目,它现在会按预期运行(在我下面的代码中,我将从 test1 切换到 test2)。由于我还没有收到任何答案,所以我将问题更改为这个。
为什么我必须在组合框中更改为不同的项目才能显示我对基础数据源所做的更改?
这是正在发生的事情的快速测试用例。
test1
至 test1asdf
txtBroken 中的文本test2
至 test2asdf
txtBroken 中的文本test1
对于下拉列表中的第一项test1
test1
文本框显示test1asdf
test1asd
test1asd
除了在幕后更改加载时选定的项目并将其改回(这看起来像是 hack)之外,我该如何解决这个问题?
我有一个组合框数据绑定(bind)到 BindingSource
绑定(bind)到 List<Holder>
它有 Holder.Name
作为它的显示值。我还有一个绑定(bind)到 Holder.Name
的文本框但如果我更改文本框中的文本,它不会更改组合框中显示的内容。更改所选项目并改回将在文本框中显示更新的文本,但仍会在组合框中显示旧值。如何使组合框中的项目更新?
using System;
using System.ComponentModel;
using System.Windows.Forms;
namespace Sandbox_Form
{
public class Form1 : Form
{
public Form1()
{
InitializeComponent();
lstBroken = new BindingList<Holder>();
lstBroken.Add(new Holder("test1"));
lstBroken.Add(new Holder("test2"));
bsBroken = new BindingSource(lstBroken, null);
cmbBroken.DataSource = bsBroken;
cmbBroken.DisplayMember = "Name";
cmbBroken.SelectedIndex = 0;
txtBroken.DataBindings.Add("Text", bsBroken, "Name");
txtBroken.TextChanged += new EventHandler(txtBroken_TextChanged);
}
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
void txtBroken_TextChanged(object sender, EventArgs e)
{
((Control)sender).FindForm().Validate();
}
private BindingSource bsBroken;
private BindingList<Holder> lstBroken;
private ComboBox cmbBroken;
private TextBox txtBroken;
private Label label1;
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.cmbBroken = new System.Windows.Forms.ComboBox();
this.txtBroken = new System.Windows.Forms.TextBox();
this.label1 = new System.Windows.Forms.Label();
this.SuspendLayout();
//
// cmbBroken
//
this.cmbBroken.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cmbBroken.FormattingEnabled = true;
this.cmbBroken.Location = new System.Drawing.Point(12, 32);
this.cmbBroken.Name = "cmbBroken";
this.cmbBroken.Size = new System.Drawing.Size(94, 21);
this.cmbBroken.TabIndex = 0;
//
// txtBroken
//
this.txtBroken.Location = new System.Drawing.Point(13, 60);
this.txtBroken.Name = "txtBroken";
this.txtBroken.Size = new System.Drawing.Size(93, 20);
this.txtBroken.TabIndex = 1;
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(13, 13);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(41, 13);
this.label1.TabIndex = 2;
this.label1.Text = "Broken";
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(284, 262);
this.Controls.Add(this.label1);
this.Controls.Add(this.txtBroken);
this.Controls.Add(this.cmbBroken);
this.Name = "Form1";
this.Text = "Form1";
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private void cmbWorks_SelectedIndexChanged(object sender, EventArgs e)
{
}
}
public class Holder
{
public Holder(string name)
{
Name = name;
}
private string _Name;
public string Name
{
get { return _Name; }
set
{
_Name = value;
}
}
}
}
如果我绑定(bind)到 List<String>
而不是使用 Holder.Name
它按预期工作(这只是一个简单的模型,真正的类不仅仅是一个名称,所以字符串列表将不起作用)。我认为这是错误的线索,但我不知道它是什么。使用 Observable 而不是列表没有区别。
最佳答案
使用 BindingList
而不是 List
.它旨在解决此类问题。 .NET 客户端团队的成员 Dinesh Chandnani 在 blog post 中声明以下内容:
BindingList<T>
is the new generic implementation of IBindingList which fires ListChanged event when items are added/removed/inserted/etc. from the list. bindingSource hooks on to these events and is thus “aware” of these changes and can notify controls bound thos this BindingSource.
我能够重现您在更新后的条目中描述的问题,但如果不稍微调整代码就无法完全重现原始问题。
通过使用 BindingList<Holder>
当焦点离开文本框时,我能够立即得到响应。添加新的数据绑定(bind)时,可以通过使用重载方法来获得即时更新。我还设置了 BindingSource
的 DataSource
直接因为使用 null
dataMember
在重载的构造函数中没有产生预期的行为。
这是我根据您的示例代码最终得到的代码:
public partial class Form1 : Form
{
private BindingSource bs;
private BindingList<Holder> bList;
public Form1()
{
InitializeComponent();
bList = new BindingList<Holder>();
bList.Add(new Holder("test1"));
bList.Add(new Holder("test2"));
bs = new BindingSource();
bs.DataSource = bList;
cmb.DataSource = bs;
cmb.DisplayMember = "Name";
cmb.ValueMember = "Name";
// updates when focus leaves the textbox
txt.DataBindings.Add("Text", bs, "Name");
// updates when the property changes
//txt.DataBindings.Add("Text", bs, "Name", false, DataSourceUpdateMode.OnPropertyChanged);
}
}
注释掉第一个txt
绑定(bind)并取消注释下面的一个以查看 DataSourceUpdateMode.OnPropertyChanged
在行动中。
这里有一些 BindingList
资源:
1)替换bsBroken = new BindingSource(lstBroken, null);
与:
bsBroken = new BindingSource();
bsBroken.DataSource = lstBroken;
或者在一行中:bsBroken = new BindingSource() { DataSource = lstBroken };
这会产生预期的行为,并立即响应更改(我在上文之前也提到过)。不要不使用接受 dataMember
的重载并将其设置为空。这样做会导致您遇到错误行为。
2) 完成上述操作后,我认为不需要 txtBroken_TextChanged
事件。注释掉要测试的事件处理程序分配,但您应该能够将其完全删除。
关于c# - 除非您先更改选择,否则 ComboBox 不会更新其显示列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3567897/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎是题外话,因为它缺乏足够的信息来诊断问题。 更详细地描述您的问题或include a min
我有一个包含一些数据的网格(用户列表)。对于每一行,我有许多操作,例如更新、删除、激活、暂停、查看您命名的订单。 而不是放置如此多的按钮,这些按钮将填充超过 400-500像素 我想放置一个组合框,其
在我的一个对话框中,我有以下控制: 我在其他地方填充 ComboBox,如下所示: 但是,如果我没有创建 ComboBox 位,MSI 仍将构
我在项目中为 MVC 使用了 kendo complete。 我有某些形式的国家/地区列表,我显示国家/地区名称,但存储国家/地区代码。 我有以下问题:当用户输入不在列表中的内容时,该值将发送到服务器
我有一个组合框,其中的值是从托管 bean 填充的,如下所示: keywordlist.setConnDB("jdbc:sqlserver://xx.xx.x.xx:1433;DatabaseName
我有一个 ComboBox,它绑定(bind)到 ViewModel 中的复杂类型集合,这些类型的长度可以是任意数量,具体取决于用户的偏好。 我已经创建了一个基于 ComboBox 默认值的样式,并且
我做了一个转换器: public class BooleanToDateConverter implements Converter { private static final long s
编辑:由于 Rob 的回答,我已经更新了下面的代码,现在它可以工作了。 我找到了几页显示如何执行此操作的页面( http://www.cmcrossroads.com/content/view/131
我是 PyQT 的新手。 我有兴趣向 tableView 的每一行添加一个组合框。在 PyQT 4 中可能吗? 我知道,在 QT5 中是可能的,但不确定 PyQT。 预先感谢您的帮助。 最佳答案 如果
我对 JavaFX(8)、HBox、ComboBox 和 HGrow 有问题。 HGrow 不能与 ComboBox 结合使用。 (信息:使用 TextField (而不是 ComboBox),它按预
我有一个 XAML UserControl连接到 ImportPresenter View 模型。有四个ComboBox我的 XAML 中的项目: CashActivityTypeBAI CashAc
我将两个组合框绑定(bind)到同一个 listviewcollection。问题是在一个组合框中选择一个值会导致另一个组合框选定项更改为第一个组合框的确切值。它们是耦合的,我希望它们彼此独立。 My
我正在尝试在 extjs 3.4 中的组合框中的选项之间添加一行。我可以添加该行,但不能用我的远程位置的数据填充它。 (如果我删除修改的 tpl 选项,它就会填充)。 这是我的代码。我只需要在“组”字
我被 WIX 安装程序中的组合框和自定义操作困住了。 我有一个包含几个值的组合框(下拉菜单)。当用户从此下拉列表中选择一个值时,我想在屏幕上显示一些文本(对于下拉列表中的每个项目都是唯一的)。 在 .
我有 ComboBox cbx 和一个包含选项卡的 TabPane(选项卡:t)和一个按钮 b1。因此,单击此按钮 b1 时,它会在 TabPane 中添加一个新选项卡 t,并在包含以下内容的 Com
我有两个组合框:水果和饮料。 fruits 具有字符串:“apple”、“orange”、“banana” drinks 具有字符串:“water”、“coffee”、“juice” 如何制作一个新组
我必须监听什么事件,以便在用户从(可编辑的)WPF ComboBox control 中选择一个选项时得到通知? 我是否必须先访问 Items 属性才能收听 Items.CurrentChanged?
我有以下简单的 QML 组合框: import QtQuick 2.0 import QtQuick.Controls 1.4 import si.mikroelektronika 1.0 Item
当我创建组合框时,列表中没有项目。现在,当我单击下拉按钮时,会调用一个函数(通过 postcommand 选项),但是一旦在我的函数中,我不知道如何在组合框的列表框中设置值。 代码如下: #u
我有两个组合框 我使用 LINQ-to-Entities 来填充 cmbGroup 组合框 Dim db as myDataEntity cmbGroup.ItemsSource = db.Mak
我是一名优秀的程序员,十分优秀!