如何根据列表框中的选定行填充多个文本框

Posted

技术标签:

【中文标题】如何根据列表框中的选定行填充多个文本框【英文标题】:How to fill multiple textboxes based on selected row in listbox 【发布时间】:2021-07-08 03:51:22 【问题描述】:

我编写了一个在列表框中填充多行的方法(但只显示注册号)。这些行称为registrationNumberhireCostcarMakecarModelcarYear。因为它只显示注册号,所以当我在列表框中选择注册号时,我想填充一些文本框。

我已经制定了一个通用方法,我相信它会如何发挥作用,但不确定如何实现它。

插入数据的代码

public void UpdateListBox(string registrationNumber, string hireCost, string carMake, string carModel, string carYear)  
foreach (string item in listBoxVehicles.Items)
    
        if (item.Contains(registrationNumber))
        
            MessageBox.Show("Registration Number: " + registrationNumber + " already exists in the list! Please try another!");
            return;
        
    
    listBoxVehicles.Items.Add(registrationNumber);

选择行代码

private void PopulateTextBoxes() 
    if (listBoxVehicles.SelectedIndex != -1)
    
        textBoxHireCost.Text = "Selected index hireCost";
        textBoxMake.Text = "Selected index carMake";
        textBoxModel.Text = "Selected index carModel";
        textBoxYear.Text = "Selected index carYear";
     

这是我点击注册号时的外观 如下图所示。右侧的字段已填充。

如何将所选注册号的值填充到文本框中?

编辑 下面是从另一个表单获取列表框数据的方法:

private void StoreData()

    //Store Data
    HomeForm list = (HomeForm)Application.OpenForms["HomeForm"];
    list.UpdateListBox(textBoxRegistrationNumber.Text, textBoxHireCost.Text + "     ", textBoxMake.Text + "     ", textBoxModel.Text + "     ", textBoxYear.Text);
    this.Hide();

【问题讨论】:

您的原始 ROW 是从哪里来的并放入 Listbox 的?是数据表吗?您需要将文本框绑定到表格中的列,以便在表格中选择一行时自动填充文本框。请参阅:social.msdn.microsoft.com/Forums/vstudio/en-US/… 它们是从另一个表单输入的。我将代码添加到问题中 【参考方案1】:

在现代编程中,倾向于将数据(= 模型)与数据的显示方式(= 视图)分开。如果将它们分开,您将能够更改显示数据的方式,而无需更改模型。

同样,您可以更改模型,而无需更改视图。例如,您当前的模型从数据库中获取数据,但如果您决定从 JSON 文件中读取数据,则无需更改视图上的任何内容。

模型和视图的分离还可以在没有表单的情况下对模型进行单元测试。

模型和视图的分离需要一些东西将它们粘合在一起。这个“适配器”通常被称为视图模型。这些项目的缩写通常称为 MVVM。

所以我们分开吧!

显然,您的模型具有可租用汽车的概念。所以我们需要一个类:

class Car

    public string RegistrationNumber get; set;
    public decimal HireCost get; set;
    public int ManufacturingYear get; set;
    ... // etc.

当然,我们需要一个程序来获取必须显示的汽车:

public IEnumerable<Car> FetchCars(...)

    // TODO implement; out of scope of the question

使用您已添加 ListBox 的可视化设计器。这个 ListBox 应该显示 Cars,并且对于每辆 Car,它应该只显示注册号。

您可以使用 Visual Studio 设计器执行此操作,另一种方法是在构造函数中执行此操作:

public MyForm()

    InitializeComponent();

    // From ever Car in the ListBox display the value of property RegistrationNumber
    listBox1.Displayember = nameof(Car.RegistrationNumber);

显示汽车:

private ICollection<Car> DisplayedCars

    get => (ICollection<Car>)this.listBox1.DataSource;
    set => this.listBox1.DataSource = value;


public void DisplayCars()

    var carsToDisplay = this.FetchCars();
    this.DisplayedCars = carsToDisplay.ToList();

还有宾果游戏:显示所有汽车的注册号。

此显示是只读的。操作员所做的更改:添加/删除行,更改注册号,不反映。

这在您当前的应用程序中可能不是问题,但如果您稍后决定在 DataGridView 中显示您的汽车,或者如果您想在操作员可以编辑的 ListBox 中使用此方法,您可能希望自动更新操作员所做的更改。在这种情况下,您应该使用 BindingList:

private BindingList<Car> DisplayedCars

    get => (BindingList<Car>)this.listBox1.DataSource;
    set => this.listBox1.DataSource = value;

要获得选定的汽车:

private Car SelectedCar => (Car)this.listBox1.SelectedItem;

或者如果你允许多选:

private IEnumerable<Car> SelectedCars = this.listBox1.SelectedItems.Cast<Car>();

回到你的问题

当我在列表框中选择注册号时,我想填充一些文本框。

因此,如果操作员在列表框中选择了一个注册号,您希望显示所选汽车的多个汽车属性值。

使用 Visual Studio Designer,或在构造函数中:

this.listBox1.SelectedIndexChanged += OnCarSelected;

private void OnCarselected(object sender, ...)

    Car selectedCar = this.SelectedCar;
    this.DisplayCarProperties(selectedCar);


private void DisplayCarProperties(Car car)

    this.textBoxHireCost.Text = car.HireCost.ToString(...);
    this.textBoxYear.Text = car.ManufacturingYear.ToString();
    ...

结论

通过将数据与查看数据的方式分开,您的代码更易于阅读。这些方法通常是一两行代码。方法是高度可重用的,模型和视图都易于更改。可以在没有视图的情况下对模型进行单元测试。

【讨论】:

以上是关于如何根据列表框中的选定行填充多个文本框的主要内容,如果未能解决你的问题,请参考以下文章

如何在运行时更改列表框中的选定项目文本?

如何将引导模式内的下拉列表的选定值获取到php中的文本框中

如何在单击时从 Column(0) 中的列表框中引用值?

如何从列表框中填充文本框?

使用组合框中的选择填充文本框中的计算字段

如何在vfp中的选定组合框中填充列表框?