zmiana pola wyszukanego elementu listy

Odpowiedz Nowy wątek
2017-05-05 11:19
0

Witam

Mam takie coś:

modbusreg.listregs.ElementAt(index)

i to zwraca mi element o danym indeksie z listy. Chciałbym dobrać się w ten lub inny sposób do publicznego pola tego elementu i np.go zmienić.
Próbowałem tak:

modbusreg.listregs.ElementAt(index).value = 5;

nie działa (błąd: cannot modify return value because it is not a variable), próbowałem też tak:

((ModbusReg.UserReg)(modbusreg.listregs.ElementAt(index))).value = 5;

też nie działa (błąd : cannot modify the result of an unboxing conversion), pytanie jak to zrobić ?

Pozostało 580 znaków

2017-05-05 11:23
0

powinno dzialac bez problemow

http://stackoverflow.com/ques[...]-an-element-in-a-generic-list

pokaz wiecej kodu (definicje klasy ktora jest w tej liscie i ktore pole chcesz zmienic)

Pozostało 580 znaków

2017-05-05 11:33
0

Zrobiłem teraz tak:

var p = modbusreg.listregs.ElementAt(index);
p.value = 5;

błędów brak ale oczekiwanych efektów także.
Podejrzewam że ten cały elementat zwraca kopię tego obiektu.

Pokazuję więcej kodu:

    public class ModbusDrv
    {
        private ModbusReg modbusreg;

        private void AnalyzeFrame()
        {
            if (index < modbusreg.listregs.Count)
            {
                ....
                var p = modbusreg.listregs.ElementAt(index);
                p.value = 5;
               ...

               if (++index >= modbusreg.listregs.Count)
               {
                    index = 0;
               }
               ....
          }
       ...
      }
        ...
}

public class ModbusReg
    {
        public struct UserReg
        {
            public byte slave_address;
            public string name;
            public UInt16 address;
            public bool rw;
            public UInt16 value;
        }

        public List<UserReg> listregs;

        public ModbusReg()
        {
            listregs = new List<UserReg>();
        }
        ....
    }
edytowany 2x, ostatnio: Adamos19, 2017-05-05 11:36

Pozostało 580 znaków

2017-05-05 12:42
0

Dodam tylko że to pytanie sprowadza się w zasadzie do tego :
Jak zmienić pole elementu listy o zadanym indeksie... ?

Pozostało 580 znaków

2017-05-05 12:43
0

Metoda ElementAt() zwraca element listy, nie kopie. Obstawiam, że to raczej ty gdzieś podmieniasz listę. Spróbuj się zdebugować, albo wypisać wartość, którą zmieniasz zaraz po wpisaniu wartości. Wtedy będziesz wiedział, że to działa.

Pozostało 580 znaków

2017-05-05 12:50
2

Mój błąd. Nie zauważyłem że jest to struktura. A elementy struktury są przekazywane przez wartość nie przez referencje...

ModbusReg temp = new ModbusReg();
for (int i = 0; i < 10; i++)
temp.listregs.Add(new ModbusReg.UserReg() { value = (ushort)i });

var userReg = temp.listregs.ElementAt(3);
userReg.value = 1000;
temp.listregs[3] = userReg;

Jeżeli nie możesz zrezygnować ze struktury to jest takie wyjście. Jeżeli będziesz dużo zmieniał taką listę to zastanów się nad użyciem klasy.

edytowany 1x, ostatnio: vesper0990, 2017-05-05 12:56
Czy możesz omówić co tu się dzieje ? - Adamos19 2017-05-05 13:02
Jaka jest idea takiego rozwiązania ? - Adamos19 2017-05-05 13:03
Najpierw tworze listę i uzupełniam ją. później za pomocą ElementAt(3) pobieram sobie 4 element listy. Można byłoby użyć też [3]. Tylko dlatego że jest to struktura przekazywana jest wartość tego elementu. Porównam to do tego, że jakbyś miał metodę zwracającą inta int getValue() i chciałbyś zrobić coś takiego getValue() = 1000; to jest tylko analogia ale chyba trafna. Po zwróceniu tego elementu (nowy "obiekt") zmieniam wartość jego pola i podmieniam ten nowy za ten stary w ostatniej linii. - vesper0990 2017-05-05 13:06

Pozostało 580 znaków

2017-05-05 12:56
0

Ok, to inaczej. Czy mógłbyś mi napisać linijkę kodu zmieniającą wartość pola elementu listy zwracanego tym elementat:

modbusreg.listregs.ElementAt(index)

Próbowałem tak:

modbusreg.listregs.ElementAt(index).value = 5;

ale wywala błąd przy kompilacji....

Pozostało 580 znaków

2017-05-05 13:13
0

Dzięki, działa, podmiana elementu listy spełniła moje oczekiwania. Pozdrawiam

Pozostało 580 znaków

2017-05-05 16:11
0

Mam jeszcze nieco inne pytanie.
Mam takie coś:

        private void textBox3_TextChanged(object sender, EventArgs e)
        {
            UInt32 temp = 0;

            /* check if correctly number value has entered , if not than clear the register address in textbox */
            try
            {
                temp = Convert.ToUInt32(textBox3.Text.ToString(), 16);
            }
            catch
            {

            }
            if (!((temp > 0) && (temp < 65536))) { textBox3.Text = "0x"; textBox3.SelectionStart = 2; }
        }

to oczywiście obsługa zdarzenia od zmiany tekstu w textboxsie.
Jak widać w tej obsłudze zdarzenia mam instrukcję textBox3.Text = "0x", czyli zmianę tekstu, czy istnieje ryzyko że zanim skończy się wykonywać obsługa tegoż zdarzenia po raz wtóry zostanie zawołana ta procedura obsługi tegoż zdarzenia ?

Pozostało 580 znaków

2017-05-05 20:09
1

Zgodnie z dokumentacją https://msdn.microsoft.com/en[...]ol.textchanged(v=vs.110).aspx event będzie wywołany albo przez modyfikację w kodzie albo przez modyfikacje użytkownika. Więc istnieje możliwość, że zapętlisz się przez takie zmiany wartości. Pamiętaj tylko że jest to wywoływane jednowątkowe tzn nie ma możliwości że naglę będzie w jednym czasie zmieniał i odczytywał wartość.

Pozostało 580 znaków

2017-05-08 15:17
0

Wie ktoś czy jeśli jakieś zdarzenie cyklicznie zapisuje metodą AppendText do richtextbox to czy może on się przepełnić czego skutkiem będzie błędne działanie programu ?

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0