Доступ к элементам в списке <> структур - PullRequest
1 голос
/ 06 декабря 2011

Немного предыстории, это началось с вопроса: Пользовательский тип данных (структуры) против массивов .

Мне удалось создать struct State, и List<State>, чтобы согласиться с ним. Первоначально это был многомерный массив, цель которого состояла в том, чтобы 0-индекс был элементом в выпадающем списке, а идекс 1-3 затем отображался в 3 текстовых полях. Теперь у меня вопрос: как мне продублировать эту функцию, используя комбинацию struct / List? Структура содержит те же 4 поля, что и в оригинальном массиве Array, но у меня возникают проблемы с пониманием того, как указать, какое поле и в какое поле входит. Из того, что я читал в другом месте, это просто вопрос использования формата struct.field, но, похоже, он не работает. Как обычно, это, наверное, что-то простое, что мне не хватает, но я не могу обернуться вокруг него.

* 1009. запись никогда не должна влиять на это).

Любая помощь будет принята с благодарностью.

Struct:

struct State
{
    private String StateID;
    private String TimeZone;
    private String CureType;
    private int CureTimeframe;

    public State(string stateID, string timeZone, string cureType, int cureTimeframe)
    {
        StateID = stateID;
        TimeZone = timeZone;
        CureType = cureType;
        CureTimeframe = cureTimeframe;
    }

    public override string ToString()
    {
        string data = String.Format("{0} {1} {2} {3}", StateID, TimeZone, CureType, CureTimeframe);
        return data;
    }
}

Список <> инициализатор:

class StatesAndTerritories
{
    public List<State> stateData = new List<State>();
    public StatesAndTerritories ()
    {
        stateData.Add(new State("AL", "CST", "None", 0));
        stateData.Add(new State("AK", "AST", "COD", 10));
        stateData.Add(new State("AR", "CST", "COD", 10));
        stateData.Add(new State("AZ", "MST", "COD", 10));
        stateData.Add(new State("CA", "PST", "COD/Mandatory", 10));
        stateData.Add(new State("CO", "MST", "Mandatory", 20));
        stateData.Add(new State("CT", "EST", "Mandatory", 10));
        stateData.Add(new State("DC", "EST", "Mandatory", 10));
        stateData.Add(new State("DE", "EST", "None", 0));
        stateData.Add(new State("FL", "EST", "COD", 10));
        stateData.Add(new State("GA", "EST", "COD", 10));
        stateData.Add(new State("HI", "HST", "None", 0));
        stateData.Add(new State("IA", "CST", "Mandatory", 20));
        stateData.Add(new State("ID", "MST", "None", 0));
        stateData.Add(new State("IL", "CST", "COD", 10));
        stateData.Add(new State("IN", "EST", "None", 0)); 
        stateData.Add(new State("KS", "CST", "Mandatory", 20));
        stateData.Add(new State("KY", "EST", "None", 0));
        stateData.Add(new State("LA", "CST", "Replevin", 0));
        stateData.Add(new State("MA", "EST", "Mandatory", 21));
        stateData.Add(new State("MD", "EST", "Mandatory", 10));
        stateData.Add(new State("ME", "EST", "Mandatory", 19));
        stateData.Add(new State("MI", "EST", "COD/Mandatory", 30));
        stateData.Add(new State("MN", "CST", "COD", 10));
        stateData.Add(new State("MO", "CST", "Mandatory", 20));
        stateData.Add(new State("MS", "CST", "None", 0)); 
        stateData.Add(new State("MT", "MST", "COD", 10)); 
        stateData.Add(new State("NC", "EST", "None", 0));
        stateData.Add(new State("ND", "CST", "None", 0));
        stateData.Add(new State("NE", "CST", "Mandatory", 20));
        stateData.Add(new State("NH", "EST", "None", 0));
        stateData.Add(new State("NJ", "EST", "COD", 10)); 
        stateData.Add(new State("NM", "MST", "COD", 10));
        stateData.Add(new State("NV", "PST", "COD", 10));
        stateData.Add(new State("NY", "EST", "None", 0));
        stateData.Add(new State("OH", "EST", "COD", 10)); 
        stateData.Add(new State("OK", "CST", "COD", 10));
        stateData.Add(new State("OR", "PST", "COD", 10));
        stateData.Add(new State("PA", "EST", "None", 0));
        stateData.Add(new State("RI", "EST", "Mandatory", 24));
        stateData.Add(new State("SC", "EST", "Mandatory", 20));
        stateData.Add(new State("SD", "CST", "COD", 10));
        stateData.Add(new State("TN", "CST", "COD", 10));
        stateData.Add(new State("TX", "CST", "Mandatory",10));
        stateData.Add(new State("UT", "MST", "None", 0));
        stateData.Add(new State("VA", "EST", "None", 0));
        stateData.Add(new State("VT", "EST", "None", 0));
        stateData.Add(new State("WA", "PST", "COD", 10)); 
        stateData.Add(new State("WI", "CST", "Mandatory", 15));
        stateData.Add(new State("WV", "EST", "Mandatory", 10));
        stateData.Add(new State("WY", "MST", "None", 0));
    }

    public IEnumerable<State> GetStates (){
        return stateData;
    }
    public IEnumerable<State> GetStatesInTimeZone(string timezone)
    {
        return stateData;
    }
    public IEnumerable<State> GetStatesCureType(string curetype){
        return stateData;
    }
    public IEnumerable<State> GetStatesCureTimeframe(int curetimeframe){
        return stateData;
    }        
}

Combobox Население:

    public void PopulateStateInfo()
    {
        StatesAndTerritories states = new StatesAndTerritories();

        foreach (State state in states.stateData)
        {
            //string s = stateData[i, 0];
            stateInfoBox.Items.Add(states.stateData);
        }
    }

Выбор ComboBox:

    private void stateInfoBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        StatesAndTerritories states = new StatesAndTerritories();
        try
        {
            stateTimeZone.Text = states.stateData.ToString();
            stateCureType.Text = states.stateData.ToString();
            stateCureTimeframe.Text = states.stateData.ToString();
            if (stateCureTimeframe.Text != 0.ToString())
            {
                stateCureAtDPD.Text = ((55 - int.Parse(stateCureTimeframe.Text)).ToString());
            }
        }
        catch (IndexOutOfRangeException)
        {
            stateTimeZone.Text = "";
            stateCureType.Text = "";
            stateCureTimeframe.Text = "";
            stateCureAtDPD.Text = "";
        }
    }

Ответы [ 3 ]

2 голосов
/ 06 декабря 2011

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

1 голос
/ 06 декабря 2011

Во-первых, вы не можете добраться до содержимого структуры,

private String cvStateID;
private String cvTimeZone;
private String cvCureType;
private int cvCureTimeframe;

Они являются частными, и поэтому не могут быть доступны извне структуры. Вам необходимо определить общедоступные свойства только для чтения:

public readonly string StateID { get { return cvStateID; } }
public readonly string TimeZone { get { return cvTimeZone; } }
public readonly string CureType { get { return cvCureType; } }
public readonly int CureTimeframe { get { return cvCureTimeframe; } }

Далее, я думаю, вы хотите отобразить только StateID в выпадающем списке. Если это так, вам нужно написать ToString () соответственно:

public override string ToString()
{
    return StateID.ToString();
}

В методе PopulateStateInfo вы не добавляете каждый элемент в список, а добавляете всю коллекцию, что необычно! Правильная реализация будет выглядеть так:

public void PopulateStateInfo()
{
    StatesAndTerritories states = new StatesAndTerritories();

    foreach (State state in states.GetStates())
    {
        stateInfoBox.Items.Add(state);
    }
}

Наконец, правильный способ обработки события SelectedIndexChanged будет выглядеть так:

private void stateInfoBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    State selectedState = (State)stateInfoBox.SelectedItem;
    stateTimeZone.Text = selectedState.TimeZone;
    StateCureType.Text = selectedState.CureType;
    stateCureTimeframe.Text = selectedState.CureTimeframe.ToString();
}

И последнее, что я хотел бы отметить, - пожалуйста, не делайте элемент stateData класса StatesAndTerritories общедоступным. Вы могли бы извлечь из этого пользу, если оно изменчиво только внутри класса.

0 голосов
/ 06 декабря 2011

Поместите новую BindingSource в форму. Затем вы можете привязать ваш List<State> к источнику привязки. Используйте элемент DataSource для привязки данных к вашим элементам управления. Все это можно сделать в конструкторе и заменить цикл, чтобы заполнить раскрывающийся элемент управления. В текстовых полях автоматически отображается один элемент (источник привязки Current), а комбинированный список можно привязать ко всему списку.

...