Eksport dataTable do pliku CSV

Drobna funkcja ułatwiająca życie, czyli zapis danych z tabeli dataTable do pliku w formacie CSV( kolumny oddzielone tabulatorem, kodowanie UTF8 ).


 /// <summary>
 /// Obsługa zapisu danych z obiektu dataTable jako pliku CSV.
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void zapiszDaneJakoCSV_Click(object sender, EventArgs e)
 {
 string Saved_File = "";

 SaveFileDialog saveFileDialog = new SaveFileDialog();
 saveFileDialog.Title = "Zapisz dane jako CSV";
 saveFileDialog.FileName = "Dane";
 saveFileDialog.Filter = "Plik .csv|*.csv";

 if (saveFileDialog.ShowDialog() == DialogResult.OK)
 {
 Saved_File = saveFileDialog.FileName;

 FileStream fs = new FileStream(Saved_File, FileMode.Create);
 StreamWriter sw = new StreamWriter(fs, Encoding.UTF8);

 int iColCount = obiektDataTable.Columns.Count;
 for (int i = 0; i < iColCount; i++)
 {
 sw.Write(obiektDataTable.Columns[i]);
 if (i < iColCount - 1)
 {
 sw.Write("\t");
 }
 }
 sw.Write(sw.NewLine);

 foreach (DataRow dr in obiektDataTable.Rows)
 {
 for (int i = 0; i < iColCount; i++)
 {
 if (!Convert.IsDBNull(dr[i]))
 {
 sw.Write(dr[i].ToString());
 }
 if (i < iColCount - 1)
 {
 sw.Write("\t");
 }
 }
 sw.Write(sw.NewLine);
 }
 sw.Close();

 }
 }

Powiększanie i przewijanie wykresów C#

Czyli mała ale bardzo przydatna rzecz, której znalezienie może zająć trochę czasu 🙂


 chartArea1.CursorX.IsUserEnabled = true;
 chartArea1.CursorX.IsUserSelectionEnabled = true;
 chartArea1.CursorY.IsUserEnabled = true;
 chartArea1.CursorY.IsUserSelectionEnabled = true;
 chart1.ChartAreas.Add(chartArea1);

Zoom and scroll chart in c#
Przykład przewijania/powiększania wykresów w C#

Przecinek w nazwie kolumny a red cross error na wykresie

Niedawno miałem nieprzyjemność borykania się z problemem „czerwonego krzyża” wyświetlanego na wykresach ( Chart , System.Windows.Forms.DataVisualization.Charting ). Błąd ten pojawia się m.in. przy problemach z przetworzeniem danych wejściowych. W moim przypadku przyczyną problemów były przecinki w nazwach kolumn obiektu DataTable, który to ustawiałem jako DataSource dla wykresu.

Dokładnie: Wartości w nazwach kolumn, które znajdowały się po przecinku były „ignorowane” w DataSource. Skutkiem tego nazwy kolumn w DataSource nie zgadzały się z tymi w DataTable, w moim przypadku parę kolumn miało tę samą nazwę ( co jest oczywistym błędem).

red cross error csharp chart
🙂

Zmiana rozmiarów paneli w c#

Przeszukując czeluści internetu natrafiłem na bardzo ciekawą, rozszerzającą możliwości zwykłego Forms.Panel 'u o dynamiczne zmienianie jego rozmiaru. Klasę, która zapewnia tę funkcjonalność znalazłem na forum msdn, oto ona:

Klasę należy dodać do projektu, skompilować. Nowa kontrolka powinna pojawić się w Toolbox 'ie

nobugz:

using System;
using System.Drawing;
using  System.Windows.Forms;

public class SizeablePanel : Panel {
 private const int cGripSize = 20;
 private bool mDragging;
 private Point mDragPos;

 public SizeablePanel() {
 this.DoubleBuffered = true;
 this.SetStyle(ControlStyles.ResizeRedraw, true);
 this.BackColor =  Color.White;
 }

 protected override void  OnPaint(PaintEventArgs e) {
 ControlPaint.DrawSizeGrip(e.Graphics,  this.BackColor,
 new Rectangle(this.ClientSize.Width -  cGripSize, this.ClientSize.Height - cGripSize, cGripSize, cGripSize));
 base.OnPaint(e);
 }

 private bool IsOnGrip(Point pos) {
 return pos.X >= this.ClientSize.Width - cGripSize &&
 pos.Y >= this.ClientSize.Height - cGripSize;
 }

 protected override void OnMouseDown(MouseEventArgs e) {
 mDragging  = IsOnGrip(e.Location);
 mDragPos = e.Location;
 base.OnMouseDown(e);
 }

 protected override void  OnMouseUp(MouseEventArgs e) {
 mDragging = false;
 base.OnMouseUp(e);
 }

 protected override void  OnMouseMove(MouseEventArgs e) {
 if (mDragging) {
 this.Size = new Size(this.Width + e.X - mDragPos.X,
 this.Height + e.Y - mDragPos.Y);
 mDragPos = e.Location;
 }
 else if (IsOnGrip(e.Location)) this.Cursor = Cursors.SizeNWSE;
 else this.Cursor = Cursors.Default;
 base.OnMouseMove(e);
 }
}

Od siebie dodałbym tylko


this.BringToFront();

w OnMouseMove();.

Obsługa right click w C#

Do osiągnięcia efektu obsługi „prawego kliku” należy odpowiednio spreparować akcje ( event ) MouseDown. Metoda, która powinna zostać wywołana dla tej akcji powinna wyglądać w następujący sposób:


private void panel_RightMouseDown(object sender, MouseEventArgs e)
{
 if (e.Button.ToString() == "Right")
 {
  // TODO
 }
}