Laden...

Forenbeiträge von lhyn Ingesamt 136 Beiträge

05.01.2022 - 19:39 Uhr

Danke Dir, dachte das muss doch etwas neues sein...
Werde ich mir anschauen und gegebenenfalls umsetzen.

Gruss Lhyn

05.01.2022 - 15:53 Uhr

Hallo zusammen,

Habe es nun mit [Produces("application/json")] getestet und Accept ist nun im Json-Format, danke dafür.
CreatedAtAction knallt aber leider noch immer.

Bin kurz davor es mit einem return Ok(project.AsDto()); zu basteln 😉

@Abt, kannst Du bitte genauer auf Deine Lösung für mein Beispiel eingehen?
Habe mir vorhin die Doku angeschaut und nach Umsetzungen gegoogelt, leider ohne Erfolg
Scheint als arbeiten noch nicht viele mit dem LinkGenerator für Routing

Gruss Lhyn

05.01.2022 - 11:39 Uhr

Hallo T-Virus,

Danke Dir für die schnelle Antwort.

Routing:


    [ApiController]
    [Route("api/[controller]")]     // api/Project

Muss mich mal schlau machen, wie ich produces = application/json einstellen kann.
Habe ich auf die schnelle nicht herausgefunden...

Gruss Lhyn

05.01.2022 - 10:07 Uhr

Hallo zusammen,

Ich habe ein Problem mit meiner WebAPI, welche ich "modernisieren" möchte und finde den Fehler nicht.
Beim Aufruf der folgenden Methode wird bei CreatedAtAction ein Fehler im Swagger ausgegeben.


        // POST /api/Project
        [HttpPost]
        public async Task<ActionResult<ProjectDto>> CreateProjectAsync([FromBody] CreateProjectDto projectDto)
        {
            var existingId = await repository.GetProjectByIdAsync(projectDto.Id);
            if(existingId is null)
            {
                ProjectModel project = new()
                {
                    Uid = projectDto.Uid
                };
                // Projekt wird dem InMemProjectRepository korrekt hinzugefügt
                await repository.CreateProjectAsync(project);

                // Hier, bei der CreatedAtAction tritt der Fehler auf
                return CreatedAtAction(nameof(GetProjectByIdAsync), new { id = project.Id }, project.AsDto());
            }
            else if(existingId.Id == projectDto.Id)
            {
                return BadRequest();
            }

            return BadRequest();
        }


       // GET /api/Project/{id}
        [HttpGet("{id}")]
        public async Task<ActionResult<ProjectDto>> GetProjectByIdAsync(int id)
        {
            var project = await repository.GetProjectByIdAsync(id);

            if (project is null)
            {
                return NotFound();
            }

            return project.AsDto();
        }

Fehlermeldung:
System.InvalidOperationException: No route matches the supplied values.
at Microsoft.AspNetCore.Mvc.CreatedAtActionResult.OnFormatting(ActionContext context)
at Microsoft.AspNetCore.Mvc.Infrastructure.ObjectResultExecutor.ExecuteAsyncCore(ActionContext context, ObjectResult result, Type objectType, Object value)
at Microsoft.AspNetCore.Mvc.Infrastructure.ObjectResultExecutor.ExecuteAsync(ActionContext context, ObjectResult result)
at Microsoft.AspNetCore.Mvc.ObjectResult.ExecuteResultAsync(ActionContext context)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeResultAsync(IActionResult result)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.ResultNext[TFilter,TFilterAsync](State& next, Scope& scope, Object& state, Boolean& isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeNextResultFilterAsyncTFilter,TFilterAsync
--- End of stack trace from previous location ---
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResultExecutedContextSealed context)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.ResultNext[TFilter,TFilterAsync](State& next, Scope& scope, Object& state, Boolean& isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeResultFilters()
--- End of stack trace from previous location ---
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeFilterPipelineAsync>g__Awaited|19_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope)
at Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger)
at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
at Swashbuckle.AspNetCore.SwaggerUI.SwaggerUIMiddleware.Invoke(HttpContext httpContext)
at Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.Invoke(HttpContext httpContext, ISwaggerProvider swaggerProvider)
at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)

HEADERS
=======
Content-Type: application/json
:authority: localhost:5001
:method: POST
:path: /api/Project
😒cheme: https
Accept: text/plain
Accept-Encoding: gzip, deflate, br
Accept-Language: de-CH,de-DE;q=0.9,de;q=0.8,en-US;q=0.7,en;q=0.6
Cookie: ai_user=nITrk|2022-01-04T22:21:05.590Z,ai_session=TVQAp|1641372830052|1641372830052
Host: localhost:5001
Referer: https://localhost:5001/swagger/index.html
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36
Origin: https://localhost:5001
Content-Length: 72
sec-ch-ua: " Not A;Brand";v="99", "Chromium";v="96", "Google Chrome";v="96"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
sec-fetch-site: same-origin
sec-fetch-mode: cors
sec-fetch-dest: empty

Ich danke Euch für die Unterstützung.

Gruss Lhyn

08.03.2021 - 08:58 Uhr

Hallo dannoe,

Ich danke Dir für die Antwort, hat mit Deiner Hilfe gut geklappt.

Unter Import konnte ich cURL auswählen und damit importieren.

Gruss Lhyn

03.03.2021 - 23:26 Uhr

Hallo zusammen,

Ich möchte mich mit einer Web API via Postman verbinden und dazu wird OAuth 2.0 verwendet.
-> ClientId und CleintSecret habe ich

In der Doku der Web API steht ich soll mich für die Schlüsselgenerierung wie folgt verbinden:


curl -X POST \
  'https://api.asdf.de/oauth/accesstoken?grant_type=client_credentials' \
  -H 'Authorization: Basic base64<ClientId:CleintSecret>' \
  -H 'Cache-Control: no-cache' \
  -H 'Content-Length: 0' \
  -H 'Postman-Token: xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'

Dann erhalte ich unter anderem den Schlüssel als Antwort.

Nun, ich habe keine Ahnung wie ich das im Postman in ein Post bringe...
Gem. Google soll das etwas mit cURL sein 🙂

Ich danke Euch für die Unterstützung.

Gruss Lhyn

22.12.2020 - 22:06 Uhr

Hallo dannoe,

Du bist super, danke Dir nun funktioniert es 👍 😁

Gruss Lhyn

22.12.2020 - 21:52 Uhr

Hallo dannoe,

Nein, der sollte calculate heissen, da der Controller "CalculateController" heisst.

Ich habe schon so einiges probiert: https wie auch http
Dann nur über http://localhost:5000/calculate, da ich Task<IActionResult> Get() geschrieben habe.

Zum Schluss noch http://localhost:5000/calculate/getproject wie im Code gezeigt "[HttpGet("GetProject")]"

Gruss Lhyn

22.12.2020 - 21:30 Uhr

Hallo zusammen,

Ich versuche mich gerade an einer kleinen web-api und finde den Fehler nicht...
Alle Abfragen mit Postman geben kein JSON zurück 8o

Über den Debugger habe ich festgestellt, dass der HttpGet Request (via Postman) des CalculateController nie aufgerufen wird, mir gehen langsam die Ideen aus.

Startup.cs



namespace DPCalculator.Api
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers();
            services.AddScoped<ICalculateService, CalculateService>();
        }

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseHttpsRedirection();

            app.UseRouting();

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
        }
    }
}


Models:


namespace DPCalculator.Api.Models
{
    public class Project
    {
        public PlcType PlcType { get; set; } = PlcType.Test1;
        public int NumberOfSelectedStations { get; set; }
    }
}

namespace DPCalculator.Api.Models
{
    public enum PlcType
    {
        Test1,
        Test2,
        Test3
    }
}

Services:


namespace DPCalculator.Api.Services.CalculateService
{
    public class CalculateService : ICalculateService
    {
        private Project _project = new Project();
        public async Task<Project> GetProject()
        {
            return _project;
        }
    }
}

namespace DPCalculator.Api.Services.CalculateService
{
    public interface ICalculateService
    {
        Task<Project> GetProject();
    }
}

Controllers:


namespace DPCalculator.Api.Controllers
{
    [ApiController]
    [Route("controller")]
    public class CalculateController : ControllerBase
    {
        private readonly ICalculateService _calculateService;
        public CalculateController(ICalculateService calculateService)
        {
            _calculateService = calculateService;
        }

        [HttpGet("GetProject")]
        public async Task<IActionResult> Get()
        {
            return Ok(await _calculateService.GetProject());
        }

    }
}

13.11.2020 - 17:50 Uhr

Hallo shazam,

Du arbeitest anscheinend mit Microsoft.Office.Interop.Excel was ein installiertes Excel benötigt.
Ist dieses auch wirklich installiert und lässt sich auf dem "Problem-PC" starten?

Als alternative kann ich Dir OpenXml empfehlen, damit kannst du viel performanter und ohne installiertes Excel eine xlsx Datei erzeugen.


    using DocumentFormat.OpenXml;
    using DocumentFormat.OpenXml.Packaging;
    using DocumentFormat.OpenXml.Spreadsheet;

Gruss Lhyn

09.11.2020 - 16:57 Uhr

Hallo echdeneth,

Du könntest die Preise/Zonen auch über eine mathematische Funktion beschreiben und dann runden 😁

Gruss Lhyn

03.03.2020 - 16:54 Uhr

Hallo MrSparkle,

Ich danke Dir für die Antwort, habe das schon fast vermutet. 🙂

Prinzipiell geht es darum, dass ich über meine Applikation einige Schritte in der "Lieferanten-Entwicklungsumgebung" automatisiert habe und nun erweitere.
Dies funktioniert mittels CSV-Import und Export.

Favorit: Favorites.L01 Lftg Turnhalle.Zone 1.Luftklappen.MPBus_VAV.MPBus_VAV_ZUL.FlowSetpoint
Technologie: MP-Bus.L01 Lftg Turnhalle.Linie2.Zone 1.MPBus_VAV_ZUL.FlowSetpoint

Nun soll im ModelFavorite die Property "LinkTarget" mit dem Link der Technologie verbunden werden. -> den oberen Link der Technologie als string

Das wollte ich über ein Link-Pattern (Binding-Template) lösen
Z.B. über eine Eingabemaske mit zwei Feldern nebeneinander, wie im Startbeitrag beschrieben.
-> der Favorit ist sehr ähnlich wie die Technologie
-> die Struktur des Favoriten wie auch der Technologie wie oben beschrieben ist nicht in Stein gemeisselt und kann zum einfacheren matchen auch angepasst werden.

Ich habe die Favoriten als List<ModelFavorite> sowie auch die Technologie als Liste

Hoffentlich ist es nun klarer, ist nicht ganz einfach das zu erklären.

Gruss Lhyn

25.02.2020 - 15:16 Uhr

Hallo zusammen,

Gerne möchte ich mir eine Art Binding-Template für Listen erstellen.
Dabei geht es darum, dass wir in unserer Lieferanten-Entwicklungsumgebung mit vielen Technologien arbeiten und diese dann auf eine Art "Favorit" verbunden werden.

Technologie A (List<MeinObjekt> techAmeinObjekt) wird verbunden mit einem Favoriten (List<MeinObjekt> meinObjekt)
Technologie B (List<MeinObjekt> techBmeinObjekt) wird verbunden mit einem Favoriten (List<MeinObjekt> meinObjekt)

Dabei sind die Technologie A bzw. B namentlich sehr ähnlich aufgebaut wie der dazugehörige Favorit.

Nun stelle ich mir das so vor:

  • Eingabemaske in der Applikation oder eine Liste, welche importiert werden kann.

Feld 1 (Objekt Quelle) <--------> Feld 2 (Binding Favorit)
{ANL}///Anlage.{Obj} <--------> {ANL}/{Obj}
... <--------> ...
... <--------> ...
... <--------> ...
... <--------> ...
... <--------> ...

Sollten diese übereinstimmen, wird im Favoritenobjekt die Property "Link" auf die Quelle verbunden (string)
Dazu ist zu sagen, dass es tausende Links sind die gemacht werden sollen.

Mir geht es darum, wie ich das konzeptionell umsetzen kann oder was es für Möglichkeiten gibt.
Wäre vermutlich auch eine typische Regex-Lösung denkbar, wobei ich das mir und den internen Usern nicht wirklich zutraue.

Ich danke Euch für die Denkanstösse.

Freundliche Grüsse

Lhyn

17.02.2020 - 17:07 Uhr

Hallo JoachimW,

Wie Du ja schreibst, sollen Abläufe automatisiert werden.

Warum gehst Du nicht den Weg über eine PLC (SPS) die Deine Probleme abdecken kann und auch dafür gedacht ist.

Auf dem Markt gibt es haufenweise Geräte, welche Visualisierung, Zeitschaltprogramme, Trends, Alarme etc. abdecken.
Diese bieten auch Schnittstellen aller gängigen Bus-Technologien an oder nimm ein DMX-Gateway.

Gruss Lhyn

17.02.2020 - 16:50 Uhr

Hallo zusammen,

Ich habe eine Software von unserem Lieferanten womit ich fast täglich arbeite.
Bei dieser Applikation ist es möglich, diese 2x zu starten und dann Content von der einen in die andere zu kopieren. Copy to clipboard.

Gerne würde ich den Content aber auch in meine, sagen wir mal Erweiterung kopieren, damit ich zusätzliche Properties zur Verfügung stellen kann.
-> Ich kann den Content auch als CSV exportieren, was aber eher umständlich ist. (so ist es momentan gelöst)

Das Programm ist mit C++ geschrieben.

Gibt es eine Möglichkeit diese Cliboard-Inhalte in meine Datenstruktur zu packen?
-> muss dazu sagen, dass mit einem kleinen Clipboard-Tool nichts in Klartext enthalten ist.

Freundliche Grüsse

Lhyn

02.07.2019 - 10:23 Uhr

Hallo aloneboy,

Du bist dem Ziel auch nicht so weit entfernt.

  1. Im Excel die Range markieren und speichern (Wie Du es schon richtig machst)
    -> Das geht super schnell, fast das einzige mit Interop 😁
  2. Die Excel-Range in eine z.B. List<string> packen
  3. mit Linq nach den gesuchten Einträgen suchen

Wie Abt schreibt ist OpenXML ist die schönste Lösung aber nicht die einfachste...

Gruss Lhyn

21.06.2019 - 17:19 Uhr

Hallo deluxe13,

List<T>.AddRange

Gruss Lhyn

01.03.2019 - 17:28 Uhr

Hallo zusammen,

Mit einem 32 bit System lassen sich 2^32, also ungefähr 4GB Arbeitsspeicher adressieren.
Verwundert also nur wenig, wird der Prozess abgewürgt... 😁

Gruss Lhyn

13.10.2018 - 12:36 Uhr

Hallo GeneVorph,

Dir fehlen alle Bindings...musst ja auch an Dein ViewModel binden 😁
-> Und demzufolge auch die Logik (z.B. ViewModel) und die dazu nötigen Methoden wie "AddMyNewUser"

Im Anhang mal ein MVVM-Beispielprojekt welches ich gut finde und auch mit ObservableCollection<> arbeitet.
-> Ist zwar mit ListView gelöst, kannst aber relativ einfach in Dein DataGrid, DataGridView ändern (View austauschen)

Gruss Lhyn

12.09.2018 - 10:44 Uhr

Hallo MrSparkle,

Erstmal gratuliere zum 5000sten Beitrag heute 😁

Aus der Softwareumgebung heisst es CSV-Export...
-> Habe mich da mal schlau gemacht und hast natürlich recht, ist gem. Definition keine CSV-Datei

Angenommen ich lese das File wiefolgt ein:


IEnumerable<string[]> lines = File.ReadLines(path).Where(x => x.Contains("$") != true).Select(x => x.Split(delimiter.ToCharArray()));

Wobei man die Where-Clausel auch entfernen kann.

Wie geht man am besten eine Validierung an?
Zählt man einfach die Elemente je "line" oder geht man auch auf die Header etc. ein?

Da ist Spaghetticode vorprogrammiert 8) (mindestens bei mir)

Gruss Lhyn

12.09.2018 - 10:00 Uhr

Hallo zusammen,

Folgende CSV-Strukur:



$target: Klasse1		
$ID,Name,Surname
0x10f4,Max,Muster
0x10f5,Florin,Städler
		
$target: Klasse2		
0x001b,Selina,Marsupilami
0x0001,Sepp,Fässler
		
$target: Klasse3		
0x10f2,Corina,Ortega


Gibt es eine Möglichkeit diese CSV-Datei auf Richtigkeit zu prüfen? (validieren)
Dabei geht es mir um die Header ($ID, Name, Surname)
-> In der Vergangenheit ist es immer mal wieder vorgekommen, dass dann einfach eine Spalte mehr enthalten war, wobei ich dann die Schüler-Objekte falsch befüllt habe...

Gruss Lhyn

12.09.2018 - 09:19 Uhr

Hallo c#atriga,

Nei, Du musst nicht weitersuchen...

Das was LaTino in seinem letzten Post schreibt ist doch schon ein Tutorial 😁
-> versuch das mal umzusetzen, sollten Fragen auftauchen dann frag einfach

Edit:
Für das Einlesen deines XML-Files (Deserialisieren) ist im zweiten Post von LaTino auch schon alles beschrieben, dabei einfach mit dem "Tutorial" starten, da dein generiertes XML welches Dir erstellt wird viel einfacher ist.

Gruss Lhyn

22.08.2018 - 10:53 Uhr

Wieder etwas dazugelernt 👍

Danke und Gruss Lhyn

22.08.2018 - 09:30 Uhr

Hallo LaTino,

Dachte in File.ReadLines ist IDisposable implementiert...

Aber dann sollte es doch mindesten in einen:



try
{}
catch()
{}


integriert werden?

Kann ja sein, dass es dieses File nicht gibt oder schon geöffnet ist etc?
-> Oder fängt mir linq diese Probleme ab?
Kann es auch gleich selbst ausprobieren...

Gruss Lhyn

21.08.2018 - 10:47 Uhr

Hallo zusammen,

Sind den bei linq-Abfragen in Verbindung mit Dateizugriff die "using(...)" nicht nötig?
Habe hier im Forum mal gelernt, dass ich diese immer in ein using packen soll 😁

Gruss Lhyn

15.08.2018 - 12:49 Uhr

Hallo ck82,

Wie Abt schon schreibt, ist es mit einer Liste bestimmt einfacher.

Kann z.B. so aussehen:



        public List<ModelCSV> ReadCSV(string path, string delimiter)
        {

            using (StreamReader reader = new StreamReader(path))
            {

                var arrCSV = from line in ReadFile(reader, delimiter)
                               select new ModelCSV
                               {
                                   Column1 = line[0],
                                   Column2 = line[1],
                                   Column3 = line[2],
                                   Column4 = line[3]
                                };

                return arrCSV.ToList();
            }

        }

        private IEnumerable<string[]> ReadFile(StreamReader reader, string delimiter)
        {
            while (reader.EndOfStream == false)
            {
                yield return reader.ReadLine().Split(delimiter.ToCharArray());
            }
        }


Dann machst Du Dir noch eine Klasse "ModelCSV" mit den Eigenschaften die Du benötigst und fertig.
-> Denke mal die CSV-Datei hat immer die selbe Struktur....kann also einfach in einer Klasse "ModelCSV" abgebildet werden

Edit benötigte Usings:
using System.Collections.Generic;
using System.Linq;
using System.IO;

Gruss Lhyn

06.07.2018 - 00:34 Uhr

Hallo KuGBeginner,

Da gibt es doch so einige Möglichkeiten 😁

1.
Das Ganze nicht mit array lösen sondern mit List<T>, welches dann Remove, RemoveAt oder RemoveRange zur Verfügung stellt.
Dann kannst Du die Listen auch sortieren und und und und...

2.
Mit LINQ arbeiten -> findest Du bestimmt haufenweise Treffer im Netz

3.
Funktion schreiben mit Maximalwertrückgabe
Dabei musst Du Dein Array und einen Startindex sowie z.B. Endindex übergeben...
Findest bestimmt selbst heraus wie das zu programmieren ist.

4.
Zwei Array mit der Grösse 10 erstellen (Index 0-9)
Durch Dein Array iterieren mit z.B. einer for schleife
Erstes Array[0-9] mit Deinem Array von [0-9] füllen
Zweites Array[0-9] mit Deinem Array von [10-19] füllen
auf dem Ersten und zweiten array den Maximalwert ermitteln

Als Gedankenstütze...

Zeig doch mal was Du schon hast

Gruss Lhyn

13.06.2018 - 09:23 Uhr

Hallo Marccore,

Versuch mal sowas, sollte es doch mit C# gelöst werden:



        public List<ModelCSV> ReadCSV(string path, string delimiter)
        {

            using (StreamReader reader = new StreamReader(path))
            {

                var arrCSV = from line in ReadFile(reader, delimiter)
                               where line[0].IndexOf("!") != 0   //Damit kann z.B. die erste Spalte mit den Headern gefiltert werden...
                               select new ModelCSV
                               {
                                   Column1 = line[0],
                                   Column2 = line[1],
                                   Column3 = line[2],
                                   Column4 = line[3]
                                };

                return arrCSV.ToList();
            }

        }

        private IEnumerable<string[]> ReadFile(StreamReader reader, string delimiter)
        {
            while (reader.EndOfStream == false)
            {
                yield return reader.ReadLine().Split(delimiter.ToCharArray());
            }
        }

Der Methode kannst Du dann den Pfad Deiner Datei und den delimiter (richtigerweise "Komma", habe aber auch schon "Semikolon"; etc. gesehen)

  1. Beiden CSV-Listen einlesen
  2. Die eine Liste in ein Dictionary packen mit Schlüsselwort von Liste...dabei dürfen diese nicht mehrmals enthalten sein
  3. Durch die Liste Iterieren und mit dem Dictionary vergleichen -> 3. Liste erstellen
  4. Ausgeben, wieder als CSV Serialisieren

Gruss Lhyn

12.06.2018 - 12:51 Uhr

Hallo TigerCrow,

Und Nein ... möchte kein Gridview oder Databindings oder ähnliches!!!
Einfach nur Zelleninhalt ändern

Was spricht dagegen?
Du erleichterst Dir damit einfach alles....

Musste anfangs auch stolpern, glaub es einfach 😁

Gruss Lhyn

04.04.2018 - 22:55 Uhr

Hallo Maxxx7,

Ich habe hier im Forum mal eine ähnliche Frage gestellt:
Gibt es ein DataGrid das funktioniert wie Excel?

Wie auch:
hier im Forum

Gruss Lhyn

01.03.2018 - 00:28 Uhr

Hallo stas,

Erstmal vorweg...ich habe mir das Datenblatt des Gateways nicht angesehen.

Auf einer DALI-Linie können 64 Geräte adressiert werden, welche dann wiederum gruppiert werden.

Also muss das Vorschaltgeräte adressiert sein und über das Gateway auch bestimmt DIESE Adresse angesprochen werden.

Aber mal im Ernst...PC=>C#=>USB/RS232=>Kabellänge=>Gateway=>DALI=>EVG

Besorg Dir ein ordentliches Gateway (z.B. mit BACnet/IP oder Modbus/IP) und kümmere Dich um die Umsetzung der Dimm-Rampe bzw. Konstantlichtregelung oder was Du da vor hast.
-> Zur Klarstellung, TRIDONIC hat sehr gute Produkte!

Btw. ist Dein Vorhaben mit einer SPS einfacher zu realisieren als mit PC und C#, zumal Du in C# noch nicht so bewandert bist.

Gruss Lhyn

14.02.2018 - 08:21 Uhr

Hallo T-Virus,

Fälschlicherweise habe ich im erste Post string.trim() geschrieben, wie Du richtig schreibst ist es momentan via string.split() gelöst.

Das ist richtig, es handelt sich nicht um Dateipfade sonder um eine Gebäudestruktur...ein Beispiel dazu:

Register.Gebäude 01.SGK01 Schaltschrank.Einstellungen.Trend_AN

Dabei möchte ich "Register.Gebäude 01." abschneiden...
-> Die ersten beiden Strukturen sind immer vorhanden, haben einfach nicht immer die selbe Bezeichnung.
-> Der delimiter ist also auch kein "/" sondern ein "."

Momentane Lösung:
-> Wobei ich dann einfach die ersten zwei strings nicht benutze und wieder Punkte einfüge



        private string[] SplitWithDelimiter(string str, string delimiter)
        {
            return str.Split(delimiter.ToCharArray());
        }


Wollte mich daran mit Regex versuchen und bin gescheitert 😁

Gruss lhyn

11.02.2018 - 20:27 Uhr

Hallo zusammen,

Das ist richtig und mir auch bewusst...jedoch ist jeder Anfang schwer 🙂

@T-Virus
Ich habe die Ordnerstruktur nur als Beispiel gewählt, weshalb DirectoryInfo nicht möglich ist.

Gruss Lhyn

11.02.2018 - 20:15 Uhr

Hallo gfoidl,

Ich habe mich nochmals daran versucht, nun funktioniert es soweit 😁


_newList = testList.Where(w => w.TestProperty.Count(c => c == '/') == 5).ToList();

Danke Dir

Gruss Lhyn

11.02.2018 - 18:35 Uhr

Hallo zusammen,

Erstmal danke für das Regex- Tutorial 😁

Habe dann doch mal ne Frage:

Ich möchte einen String "beschneiden" und nicht auf string.Trim() setzen....



            string folderPath = $"{pathToDesktop}/{folderName}";


Wie kann ich nun via Regex die ersten beiden Ordner abschneiden und den beschnittenen String zurückerhalten?

Ich danke Euch für die Unterstützung.

Gruss Lhyn

11.02.2018 - 18:21 Uhr

Hallo zusammen,

Versuche mich gerade an einigen Linq-Querys und habe mal ne Frage dazu:



            List<ModelTest> _newList = new List<ModelTest>();
            _newList = testList.Where(w => w.TestProperty.Contains("/").Count() == 5).Select().ToList();


Ist sowas in dieser Art und Weise in einer einzigen Query überhaupt möglich?

Gruss Lhyn

04.10.2017 - 22:12 Uhr

Hallo zusammen,

Ich möchte dem Benutzer einiges an Vorlagen in einem DataGrid zur Verfügung stellen.

Nun frage ich mich, wie ich diese Vorlagedaten in meine Objekte laden soll...
-> Dabei möchte ich keine externen Pfadangaben verwenden, die Vorlagen sollen direkt im Programm enthalten sein

Momentan stehen mir die Vorlagen als csv bzw. xlsx zur Verfügung.
-> Können natürlich auch noch formatiert, in xml etc. gewandelt werden

Dabei geht es mir nicht um das deserialisieren sondern wie man das konzeptionell angeht. 😁

Wie sollte man das umsetzen?
-> DataSet werde ich nicht einsetzen 8)

Ich danke Euch für die Unterstützung

Gruss Lhyn

29.06.2017 - 13:16 Uhr

Hallo zusammen,

Ich habe im Anhang mal die Dampftafel eingefügt um welche es sich dabei handelt.

Es geht um die Abhängigkeit zwischen Druck und Temperatur des Kältemittels R134a.

@gfoidl, genau diese erweiterten Parameter {D, E, F} kann ich nicht finden, ist definitiv die eleganteste Lösung 😁

@MrSparkle, ich habe das Problem mal versucht in Code zu übersetzen:



        private double CalculateTest(double xCoordinate /*Wert 126.75*/)
        {
            // Werte sind nicht aus Dampftabelle
            double xPoint1 = 0;     //Soll ich diese Koordinaten in ein 2D-Array oder Liste packen? 
            double xPoint2 = 10.75;
            double xPoint3 = 100;
            double xPoint4 = 1000;

            double yPoint1 = 25;
            double yPoint2 = 289;
            double yPoint3 = 150.165;
            double yPoint4 = 102.15;

            //Entscheiden zwischen welchen Werten ich momentan auf der x-Achse stehe...wie sauber lösen?
            //xCoordinate steht bei angenommen 126.75 also befinde ich mich zwischen Punkt 3 und Punkt 4

            return LinearFunction(xCoordinate, xPoint3, yPoint3, xPoint4, yPoint4);
        }

        private double LinearFunction(double x, double x1, double y1, double x2, double y2)
        {
            return (y2 - y1) / (x2 - x1) * (x - x1) + y1;
        }


Gruss Lhyn

29.06.2017 - 11:10 Uhr

Hallo zusammen,

Ich habe ein Problem mit Thermodynamik bzw. mit der erweiterten Antoine-Gleichung.
-> Werde nicht schlau daraus wie ich die Parameter aus den Dampftabellen bekomme...

Dann dachte ich mir, die Dampftabellen genügen als Genauigkeit wobei ich dann einfach zwischen den Punkten interpolieren. (lineare Interpolation)

Nun stellt sich mir die Frage wie ich das Softwaretechnisch hinbekomme?
-> Wie binde ich die Punkte sauber in die Klasse ein und entscheide zwischen welchen zwei Punkten ich mich befinde, damit ich eine linear Funktion anwenden kann?

Ich danke Euch für die Unterstützung.

Gruss Lhyn

26.04.2017 - 16:06 Uhr

Hallo KroaX,

Nun stelle ich mal wieder fest, dass ich mich namespaces in xaml nicht wirklich auskenne...

Wie soll ich das den nun unterhalb einbinden?



<Window x:Class="MyTool.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        
        xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
               
        xmlns:local="clr-namespace:MyTool"
        
        Title="MyTool"
        Height="300"
        Width="400"
        WindowStartupLocation="CenterScreen"
        Icon="_Images/AppIcon.ico"
        DataContext="{StaticResource MainViewModel}">


Ich arbeite mit Visual Studio Community 2015

Gruss Lhyn

25.04.2017 - 21:26 Uhr

Hallo zusammen,

Ich habe im MainWindow.xaml den DataContext wie folgt gesetzt:


        DataContext="{StaticResource MainViewModel}"

Im MainViewModel habe ich nun einige Command-Properties (ICommand) an welche ich im xaml binde:


        public ICommand CloseApplication
        {
            get
            {
                return _closeApplication;
            }
        }

Das funktioniert soweit ganz gut, ich stelle mir einfach die Frage weshalb bei diesen Properties Intellisense nicht funktionert, bzw. ich die Properties auswendig kennen muss?
Erkennt Intellisense dabei diese ICommand- Properties nicht?

Folgendes funktioniert perfekt: (Das MainViewModel hält ein ViewModelProject)


        public ViewModelProject Project
        {
            get
            {
                return _project;
            }
            set
            {
                if (object.Equals(_project, value)) return;
                _project = value;
                OnPropertyChanged();
            }
        }

Wobei dann im MainWindow.xaml die Intellisense via:


{Binding Project.Blablubb}

Wunderbar funktioniert... 😁

Gruss Lhyn

23.04.2017 - 10:43 Uhr

Hallo CWolle,

Es ist kein Startwert des Eigenschaftsfeldes definiert, sondern nur eine Liste welche beim benutzen der Combobox abgerufen wird.

Du kannst z.B. im Konstruktor des ViewModels den "Startwert" an die Property übergeben.
Auch über das Laden des Models über irgendwelche Dataprovider...

Gruss Lhyn

16.04.2017 - 22:40 Uhr

Hallo Coffeebean,

Habe gerade Deinen Beitrag gelesen, ausprobiert und funktioniert wie gewünscht. 8)

Dankeschön Euch beiden.

Gruss Lhyn

16.04.2017 - 22:32 Uhr

Hallo chilic,

Danke Dir für die Antwort, werde ich so umsetzten. 😁

Gruss Lhyn

16.04.2017 - 19:13 Uhr

Hallo zusammen,

Folgender Code:



                string[] str = SplitWithDelimiter(list[i].TName, ".");

                model.Text1 = str[0];
                model.Text2 = str[1];
                model.Text3 = str[2];
                model.Text4 = str[3];
                model.Text5 = str[4];
                model.Text6 = str[5];
                model.Text7 = str[6];
                model.Text8 = str[7];


Ich möchte mit einem StringArray einige Properties eines Objektes befüllen.
-> Out of Array bei weniger als 8 Einträgen in str

Mir ist auch bewusst, dass ich über str.Length() die länge erhalte, kann aber nur durch das Array und nicht durch die Properies iterieren...

Gibt es eine hübsche Möglichkeit auf einer Zeile zu bestimmen ob es diesen Index überhaupt gibt?

Sowas in der Art: model.Text1 = str[0].IfIndexValidGetValue;

Gruss Lhyn

11.04.2017 - 07:45 Uhr

Hallo lutzeslife,

Versuch mal SurveyMonkey

Funktioniert super, habe vor einigen Wochen einen Link mit Umfrage erhalten.

Gruss Lhyn

23.03.2017 - 13:22 Uhr

Hallo spry64,

Schau mal hier:

IP-Adressen sortieren

Gruss Lhyn

09.03.2017 - 09:03 Uhr

Hallo ErazorVIP,

Ich empfehle Dir in WPF mit DataBindings zu arbeiten.

z.B.



                <ComboBox Grid.Row="0" Grid.Column="1" MaxHeight="25"                                  
                                      ItemsSource="{Binding ComboListAusViewModel, Mode=OneWay}" 
                                      SelectedItem="{Binding PropertyAusViewModel, Mode=TwoWay}" 
                                      IsSynchronizedWithCurrentItem="True">
                </ComboBox>


Gruss Lhyn

02.03.2017 - 09:45 Uhr

Hallo Janiiix3,

Ich habe hier im Forum mal eine ähnliche Frage gestellt:
Gibt es ein DataGrid das funktioniert wie Excel?

Wie gewünscht für Windows-Forms, kannst Dir mal anschauen.

Gruss Lhyn

02.03.2017 - 09:01 Uhr

Hallo BJA-CH,

Als alternative zum DataGrid, kannst Du auch Deinen kompletten Datensatz via z.B. openXML in ein Word oder Excel einfügen und dann ausdrucken.

Auch direkt ein PDF-erstellen ist über entsprechende Klassen möglich.

Gruss Lhyn