Danke für die Info ))
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?
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);
}
}
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);
}
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";
}
}
}
Vielen Dank für die schnelle Antwort. Ich hatte da etwas übersehen :\
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.
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?
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;
}
}
}
Vielen Dank, das funktioniert - nur musste ich in der TryReadLine-Methode dem string value einen Leerstring zuweisen, d. h. value = "".