【问题标题】:Update textbox based on combobox selection (.CSV/Array)根据组合框选择更新文本框(.CSV/Array)
【发布时间】:2012-12-10 23:15:59
【问题描述】:

我有一个包含列的 .csv 文件。我已经有一个表单,允许用户将信息插入并保存到这个 .csv 文件中。

在一个单独的表单中,我创建了通过项目 ID 选择项目的功能。我有一个组合框,它显示 .csv 文件中的项目 ID 的下拉列表。目前,唯一的项目 ID 是 1000-1003。

    public void Items()
    {
        int itemID = 0;
        Inventory[] IArray = Inventory.getInv();
        for (int v = 0; v < IArray.Length; v++)
        {
            if (IArray[v] != null)
            {
                itID = IArray[v].getIID();
                Field.Items.Add(itID + "\r\n");
            }
        }
    }

当我选择某个项目 ID 时,我希望我的只读文本框根据文件更新为适当的名称/折扣/价格。问题是,无论我选择什么 ID,它都会显示 .csv 文件的最后一行(现在最后一行是 Item ID 1003)。

    private void Field_SelectedIndexChanged(object sender, EventArgs e)
    {
        string itName = "";
        double disc = 0;
        double price = 0;
        Inventory[] IArray = Inventory.getInv();
        for (int v = 0; v < IArray.Length; v++)
        {
            if (IArray[v] != null)
            {
                itName = IArray[v].getItName();
                disc = IArray[v].getDisc();
                price = IArray[v].getPrice();

                itNameS.Text = (itName);
                itPriceS.Text = Convert.ToString(price);
                itDiscountS.Text = Convert.ToString(disc);
            }
        }
    }

【问题讨论】:

  • 只是检查这是 Webforms 吗?
  • Hannah,您可能需要进行一些调整,这样您就不需要在每次更改组合框时都获取整个库存。如果你想复习,请告诉我。
  • 如果你有时间那就太好了/....它仍然无法正常工作“必须有 20 个代表...grr”

标签: c# .net winforms csv properties


【解决方案1】:

您可以使用以下项目列表来绑定到您的组合框。然后,您可以设置索引上的文本框文本值已更改。

我的属性与您的不完全匹配,但可以节省您的时间,因为您不需要每次更改索引时都获取项目。

class Item : INotifyPropertyChanged
{

    public event PropertyChangedEventHandler PropertyChanged;

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

    private string _itemId;
    public String ItemID
    {
        get { return _itemId; }
        set { _itemId = value; NotifyPropertyChanged("ItemID"); }
    }

    private string _itemName;
    public String ItemName
    {
        get { return _itemName; }
        set { _itemName = value; NotifyPropertyChanged("ItemName"); }
    }

    private double _discountValue;
    public Double DiscountValue
    {
        get { return _discountValue; }
        set { _discountValue = value; NotifyPropertyChanged("DiscountValue"); }
    }

    private double _price;
    public Double Price
    {
        get { return _price; }
        set { _price = value; NotifyPropertyChanged("Price"); }
    }
}


public partial class Form1 : Form
{
    BindingList<Item> OurItems = new BindingList<Item>();

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        PopulateItems();
        BindComboBox();


    }

    private void BindComboBox()
    {
        cboItems.DataSource = OurItems;
        cboItems.DisplayMember = "ItemID";
        cboItems.ValueMember = "ItemID";
    }

    private void PopulateItems()
    {
        StreamReader sr = new StreamReader(@"New Text Document (4).txt");
        foreach (string sLine in sr.ReadToEnd().Split(new string[] {"\r\n"}, StringSplitOptions.RemoveEmptyEntries ))
        {
            var oProps = sLine.Split(new char[] {','});
            OurItems.Add(new Item() {ItemID = oProps[0], ItemName = oProps[1], DiscountValue = Double.Parse(oProps[2]), Price = Double.Parse(oProps[3])});
        }
    }

    private void cboItems_SelectedIndexChanged(object sender, EventArgs e)
    {
        var oSelected = (Item)cboItems.SelectedItem;

        tbName.Text = oSelected.ItemName;
        tbDiscount.Text = oSelected.DiscountValue.ToString();
        tbPrice.Text = oSelected.Price.ToString();

    }

    private void button1_Click(object sender, EventArgs e)
    {
        OurItems[0].Price = OurItems[0].Price + 50;
    }
}

【讨论】:

【解决方案2】:

您正在遍历整个数组并更新每条记录(行;数组元素)的框。

您需要添加一个停止处理/更新的条件。大致如下:

    for (int v = 0; v < myInvArray.Length; v++)
    {
        if ((myInvArray[v] != null) || (myInvArray[v].getItemID() == the_id_from_the_combobox))
        {
            itemName = myInvArray[v].getItemName();
            discountValue = myInvArray[v].getDiscountValue();
            price = myInvArray[v].getPrice();

            itemNameShown.Text = (itemName);
            itemPriceShown.Text = Convert.ToString(price);
            itemDiscountShown.Text = Convert.ToString(discountValue);
        }
    }

【讨论】:

  • 感谢您的回复。当您说“the_id_from_the_combobox”时,您的意思是,我应该添加变量“itemID”,然后将我的代码编辑为 if ((myInvArray[v] != null) || myInvArray[v].getItemID() == (itemID) )
  • 因为它不适合我。所以我觉得我误解了“the_id_from_the_combobox”......再次感谢!
  • 我不知道您是如何将这些值放入组合框中的。所以它将类似于 ordItemIDField.SelectedText (您需要获取组合框中所选项目的 ItemID 值,并且用于执行此操作的代码取决于您如何填充组合。首先尝试.SelectedText 属性)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-24
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多