С# с использованием SelectedIndexChanged через поле со списком для изменения метки с текстом из текстового файла

В поле со списком я могу заставить его загружать все преобразования в поле со списком. Но когда я щелкаю конверсию из поля со списком, по какой-то причине данные меняются на нулевые. Я не уверен, что кто-нибудь может мне помочь, не глядя на весь мой код. Но я подумал, что стоит попробовать. Я пытаюсь выбрать преобразование, то есть футы в мили, и чтобы «футы» были на первой метке, а «мили» - на второй. Вот код для события щелчка поля со списком:

public void CmboBxConversion_SelectedIndexChanged(object sender, EventArgs e)
{
    //This is not working. If I were to say change the  conversion.From to "hello world" the label text does change to hello world.
    //But, as is it is it changes it to a null.
    Conversion conversion = new Conversion();

    Lbl1stConv.Text = conversion.From;  //these are labels
    LblSecondConv.Text = conversion.To;
}

//this is my Conversion class
public class Conversion
{
    public string From { get; set; }
    public string To { get; set; }
    public decimal Multiplier { get; set; }

    public string GetDisplayText(string sep)
    {
        return From + ("|") + To + ("|") + Multiplier;
    }

    public string GetCmboBxText(string sep)
    {
        return From + (" to ") + To;
    }
}

//this is how I am loading the combo box
private void Conversion_Load(object sender, EventArgs e)
{
    conversions = ConversionDB.GetConversions();
    FillConversionComboBox();
}

//here is the method used to fill the combobox
private void FillConversionComboBox()
{
    CmboBxConversion.Items.Clear();

    foreach (Conversion c in conversions)
    {
        CmboBxConversion.Items.Add(c.GetCmboBxText("\n"));
    }
}

    //this is a data base class that the textfile is pulling data
    public static class ConversionDB
{
    public const string Path = @"..\..\Conversions.txt";
    //public const string Path = Dir + "Conversions.txt";

    public static List<ConversionList> GetConversions()
    {


        StreamReader textIn = new StreamReader(
            new FileStream(Path, FileMode.Open, FileAccess.Read));
        List<ConversionList> conversions = new List<ConversionList>();
        while (textIn.Peek() != -1)
        {
            string row = textIn.ReadLine();
            string[] columns = row.Split('|');
            ConversionList conversion = new ConversionList();
            conversion.From = columns[0];
            conversion.To = columns[1];
            conversion.Multiplier = Convert.ToDecimal(columns[2]);
            conversions.Add(conversion);
        }

        textIn.Close();
        return conversions;
    }

person Sam Peebles    schedule 23.07.2015    source источник
comment
В вашем примере похоже, что From никогда не присваивается значение, но вы ссылаетесь на него. Где ему присваивается значение?   -  person Krikor Ailanjian    schedule 23.07.2015
comment
А, хороший улов. Это объяснило бы ноль. У меня также есть класс базы данных. Я отредактирую свой вопрос с ним. Не уверен, что это отвечает на ваш вопрос о предоставлении значения From   -  person Sam Peebles    schedule 23.07.2015
comment
Избавьтесь от скобок вокруг ваших строковых литералов. Например, измените return From + ("|") + To + ("|") + Multiplier; на return From + "|" + To + "|" + Multiplier.ToString();.   -  person Idle_Mind    schedule 23.07.2015


Ответы (1)


Я не уверен, что это то, что вы хотите, но это немного более простой подход, который дает вам ту же функциональность. Я думаю, будет намного проще, если вы привяжете выпадающий список к своему списку конверсий. С выбранным элементом и выбранным значением будет легче работать.

    public partial class Form1 : Form
{
    private List<Conversion> conversions=new List<Conversion>();
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        loadconversions();
        //foreach (Conversion c in conversions)
        //{this.comboBox1.Items.Add(c); }
        comboBox1.DataSource = conversions;
        this.comboBox1.DisplayMember = "GetCmboBxText";

    }

    private void loadconversions()
    {
        fillconversions("feet","yards",3);
        fillconversions("yard", "feet", 0.33m);
        fillconversions("km", "mile", 0.54m);
        fillconversions("mile", "km", 1.6m);
        fillconversions("quarts", "gallons", 4);

    }
    private void fillconversions(string from, string to, decimal multiplier)
    {
        conversions.Add(new Conversion(from, to, multiplier));
    }

    private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        Conversion c = (Conversion)this.comboBox1.SelectedItem;
        this.textBox1.Text = c.GetDisplayText;
    }
}
public class Conversion
{
    public string From { get; set; }
    public string To { get; set; }
    public decimal Multiplier { get; set; }

    public Conversion(string from, string to, decimal multiplier)
    {
        From = from;
        To = to;
        Multiplier = multiplier;
    }

    public string GetDisplayText
    {
        get { return From + ("|") + To + ("|") + Multiplier; }
    }

    public string GetCmboBxText
    {
        get
        {
            return From + (" to ") + To;
        }
    }
}
person Haim Katz    schedule 23.07.2015
comment
поэтому я должен указать преобразование = CmboBxConversion_SelectedIndexChanged.Properties.Items[CmboBxConversion_SelectedIndexChanged.SelectedIndex]); прямо над линиями этикетки? - person Sam Peebles; 23.07.2015
comment
Я получаю сообщение об ошибке, когда я делаю это, говоря, что это метод, который недействителен в этом контексте. - person Sam Peebles; 23.07.2015
comment
Проверьте свойства поля со списком, чтобы узнать, как хранится элемент, но я думаю, что это сработает: - person Haim Katz; 23.07.2015
comment
Это отличный материал! Мой новый вопрос: я извлекаю свои данные из текстового файла, поскольку это требование для моего школьного проекта. С помощью этого показанного примера пользователь программы сможет добавить преобразования через другую форму в текстовый файл, а затем обновить его в этом поле со списком как элемент, который можно выбрать? - person Sam Peebles; 23.07.2015
comment
Когда я добавляю весь этот код, у меня возникают проблемы. Я немного поиграю с этим. Я очень ценю помощь - person Sam Peebles; 23.07.2015
comment
Мой текстовый файл настроен следующим образом: Километры|Мили|0,6214 (новая строка) Футы|Метры|0,3048 (новая строка) Метры|Футы|3,2808 (новая строка) Дюймы|Сантиметры|2,54 (новая строка) Сантиметры|Дюймы| 0,3937 Итак, как я могу отличить, например, что километры = от, мили = до и 0,6214 = множитель? - person Sam Peebles; 23.07.2015
comment
Это действительно другой вопрос, Сэм, но вы бы использовали StreamReader(), ReadLine() и String.Split(). - person Idle_Mind; 23.07.2015
comment
что делает строка this.comboBox1.DisplayMember = GetCmboBxText? - person Sam Peebles; 24.07.2015
comment
Когда вы привязываете поле со списком к списку (в отличие от простого добавления элементов), элемент отображения определяет свойство объекта списка, которое будет отображаться. Если вы привязываете свой объект преобразования, как в примере, вам не нужно отделять строку от поля со списком. Вы можете получить свойство прямо из предмета. - person Haim Katz; 26.07.2015
comment
Конверсия c = (Конверсия)this.comboBox1.SelectedItem; один мой ответ = некоторое значение * c.multiplier - person Haim Katz; 26.07.2015