Laden...

Forenbeiträge von Noodles Ingesamt 4.644 Beiträge

29.01.2008 - 07:29 Uhr
// Variante 1:

foreach( DataColumn col in dataTable.Columns )
    col.ReadOnly = true;

// Variante 2:

DataView view = dataTable.DefaultView;
view.AllowDelete = false;
view.AllowEdit = false;
view.AllowNew = false;
28.01.2008 - 07:09 Uhr

Es existieren meiner Meinung nach bessere Alternativen (allerding sind das Produkte), auch wenn diese relativ teuer sind.

Welche? Der BTS ist nicht mit der WF zu vergleichen.

26.01.2008 - 15:24 Uhr

Ich würde meinen, dass die WF nutzbar ist und die meisten Punkte des Artikel sind für mich nicht nachvollziehbar. Eine Alternaive wüsste ich nicht, da die WF ja ein Framework ist und kein Produkt.

25.01.2008 - 07:39 Uhr

[...](kann im umkehrschluss aber auch nachteilig sein: Baut man ein Bug ein, haben alle den Bug).[...]

Naja, mittels MSI und Verteilung über ActiveDirectory installier ich ein Programm auf 500 Rechnern gleichzeitig.

Also hast Du das Problem evtl. auch bei Desktopanwendungen.

22.01.2008 - 12:03 Uhr

Such mal nach Nullable Types. Das ist ein Feature von .NET 2.0.

22.01.2008 - 11:03 Uhr

Meinst Du einen Blog im Internet oder ein Unterforum auf mycsharp?

22.01.2008 - 09:06 Uhr

Das MDI Konzept gibt es nicht mehr in WPF. Zmindest habe ich es so noch aus der Beta Phase in Erinnerung.
Bedenke bei Deiner Wahl auch, dass Du die Systemanforderungen beachten musst.

WPF -> XP SP2, 2003 Server und Vista.

22.01.2008 - 07:04 Uhr

Und Deine Frage war jetzt was?

22.01.2008 - 06:58 Uhr

Hast Du auch die Forumsuche bemüht?

19.01.2008 - 14:47 Uhr

Du kannst im RowsDefaultCellStyle die SelectionBackColor auf Transparent setzen.

18.01.2008 - 12:50 Uhr
row.Cells["imageColumn"].Value = ...;
18.01.2008 - 10:27 Uhr
SELECT * FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
17.01.2008 - 10:35 Uhr

Du wirst wohl iterieren müssen.

17.01.2008 - 10:28 Uhr
grid.Columns[0].SortMode = DataGridViewColumnSortMode.NotSortable;
15.01.2008 - 15:22 Uhr
List<Person> persons = ...

// hier ( mit LINQ ) bekommst Du unter Umständen mehrere Personen
var founed = from p in persons where p.FirstName == "..." select p;

Person p2 = persons.Find(delegate(Person p) { return p.FirstName == "..."; });
14.01.2008 - 14:09 Uhr

Für den Bereich:

NOT LIKE '[A-Z]%'
11.01.2008 - 13:24 Uhr

Du musst Dir einen eigenen Provider schreiben, der auf Deine DB geht. Wie das funktioniert siehst Du ja in den Links.

11.01.2008 - 08:51 Uhr

DataGrid...bestimmte Zelle

Ist zwar ein Beispiel um den Wert einer Zelle zu setzen, aber das musst ja nur rumdrehen.

07.01.2008 - 14:42 Uhr

Gibt es eine Übersicht, für welche Datenbanksysteme Provider verfügbar sind? Gibt es Pläne von Microsoft in Zukunft noch andere DBMS als SQL Server in DLINQ zu unterstützen?

So weit ich weiß, gibt es keine Anstrengungen von MS für weitere Provider. Aber an diese Stelle soll ja auch das ADO.NET Entity Framework treten, welches ebenfalls mit LINQ abgefragt werden kann.

07.01.2008 - 13:20 Uhr

SQL Injection:
In DLINQ werden ja alle Daten via SqlParameter an die Datenbank übertragen. Ist DLINQ also 100% sicher was SQL Injections angeht?

Ja, so sicher wie es mit den SqlParamteren bisher war.

Datenbankunabhängigkeit:
In ADO.NET gibt es ja DbProviderFactories um unabhängig von einer konkreten Datenbank zu programmieren. Wie wird dies in DLINQ realisiert?

Garnicht. Linq to SQL ist nur für den SQL Server. Für andere Datenbanken benötigst spezielle Provider. Für diesen Zweck (Datenbankunabhängigkeit uvm.) wird es das ADO.NET Entity Framework geben.

06.01.2008 - 23:16 Uhr

Meinst Du die, die im obj\Debug Ordner abgelegt werden?

30.12.2007 - 17:12 Uhr

ListBox.DrawItem Event

Einen Font erstellst Du über die Font Klasse.

30.12.2007 - 14:20 Uhr

ComboBox?

20.12.2007 - 12:20 Uhr

Hi Noodels,
Gehe ich recht in der Annahme, daß das der richtige Weg ist?

Wenn es funktioniert, scheint es ein richtiger Weg zu sein.
Ich musste dies nicht tun.

Ich habe folgendes gemacht:

  1. Mapping der Customer Klasse erstellt ( Linq To SQL )
  2. Partial class Customer mit neuer Property erstellt
  3. Über das DataSource Windows ein Customer Objekt angelegt und per Drag and Drop das Grid erstellt
  4. die BindingSource mit den Daten gefüllt
20.12.2007 - 11:53 Uhr

Die BindingSource zeigt die Daten nicht an, dass macht das Control. Sie verwaltet die Daten und kapselt zum Beispiel den CurrencyManager.

20.12.2007 - 11:32 Uhr

BindingSource verwendet man um Daten an ein Control zu binden, zum Beispiel ein DataGridView.

20.12.2007 - 10:44 Uhr

Wie hast Du die Property hinzugefügt? Ist sie bei Dir unter DataSources /Customer sichtbar?

In einer partial class. In den DataSources ist sie auch nicht sichtbar. Aber im Grid wird sie angeziegt

19.12.2007 - 19:10 Uhr

Zeig mal etwas mehr Code. Hab es nachgestellt und die Eigenschaft wird sofort im Grid angezeigt.

19.12.2007 - 13:55 Uhr

Ich tippe, dass es an Deiner Bindingsource liegt. Wie hast Du die den erstellt? Kennt diese das Feld?

Wenn Du Deinen DataContext per LINQ abfragst und das Ergebnis mit ToList direkt an ein DataGridView bindest, solltest Du die Property sehen.

17.12.2007 - 20:03 Uhr

Wird eine Exception geworfen?

17.12.2007 - 10:46 Uhr
deineLetzteSpalte.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill;
17.12.2007 - 10:25 Uhr
DataTable.Load( SqlDataReader );
17.12.2007 - 09:12 Uhr

Ein TextBox hat die Eigenschaft Text, aus der Du den Inhalt bekommst. Für einen Vergleich musst Du evtl. noch einen Cast durchführen.

17.12.2007 - 08:18 Uhr

Versuch mal:

private void dataGridView1_DragDrop( object sender, DragEventArgs e )
{
    object[] rowArray = ((DataRowView)bindingSource[rowIndexFromMouseDown]).Row.ItemArray;
    destinationTable.Rows.Add(rowArray);
}
12.12.2007 - 19:47 Uhr

Schau mal hier, vielleicht hilft Dir das.

24.11.2007 - 19:01 Uhr

Original von ZiMD
kennt ihr schon die neuen Auto-Implemented Properties von C# 3.0?

Ja.

[Artikel] Spracherweiterungen in C# 3.0
VS2008 prop CodeSnippet

24.11.2007 - 17:12 Uhr

Original von Regenfreund
Ich habe jetzt eigentlich nur eine Anfängerfrage: wer schließt diesen Thread, beendet damit die Diskussion und ermöglicht den Beteiligten sich um die wichtigen Dinge des Lebens zu kümmern?

Das scheinen doch alle bereits zu tun. Seit dem 19.11.2007 01:10 war ja Ruhe, bis heute eben.

24.11.2007 - 16:30 Uhr

Ein Dreieck könntest Du mit folgendem Code zeichnen.

private void dataGridViewCellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
     if (e.ColumnIndex < 0 || e.RowIndex < 0)
          return;

     e.PaintBackground(e.ClipBounds, true);

     GraphicsPath path = new GraphicsPath();
     path.AddLine(e.CellBounds.X, e.CellBounds.Y, e.CellBounds.X + 10, e.CellBounds.Y);
     path.AddLine(e.CellBounds.X, e.CellBounds.Y, e.CellBounds.X, e.CellBounds.Y + 10);
     path.AddLine(e.CellBounds.X, e.CellBounds.Y + 10, e.CellBounds.X + 10, e.CellBounds.Y); 
     e.Graphics.FillPath(Brushes.Red, path);

     e.Paint(e.CellBounds, DataGridViewPaintParts.Border |DataGridViewPaintParts.ContentForeground);
     e.Handled = true;
}
20.11.2007 - 09:17 Uhr

Ja. Du kannst aber auch mit VS 2008 .NET 2.0 Programme schreiben.

18.11.2007 - 20:37 Uhr

Automatische Eigenschaften
Bei automatischen Eigenschaften handelt es sich um ein Feature, bei dem der Compiler automatisch die privaten Felder einer Eigenschaft setzt. Der ein oder andere hat sich vielleicht schon über das "seltsame" Verhalten des Codesnippets in Visual Studio 2008 gewundert,

// bisher
private string firstName;
public string FirstName
{
    get { return firstName; }
    set { firstName = value; }
}

// ab Visual Studio 2008
public string FirstName { get; set; }

Erweiterungsmethoden
Durch Erweiterungsmethoden können zum Beispiel zu versiegelten Typen Methoden hinzugefügt werden. Es bestand das Problem auf IEnumerable<T> Methoden aufzurufen. Allerdings kann man ja dem Interface keine Methoden nachträglich hinzufügen. Es sei denn, man nimmt in Kauf das ein gewisse Anzahl von Anwendungen mit diesem Framework nicht mehr funktionieren würden. Erweiterungsmethoden müssen in einer statischen Klasse, als public und statisch definiert sein. Der erste Parameter wird mit einem this vor dem Datentyp gekennzeichnet. Daran und an dem Schlüsselwort static erkennt der Compiler die Erweiterungsmethode.

Beispiel für eine Erweiterungsmethoden

public static bool IsInRange( this int source, int min, int max )
{
    return ( source > min && source < max );
}
         
// auf jedes IEnumerable<T> anwendbar.
public static T Where<T>( this IEnumerable<T> source, Func<T, bool> func )
{
    // ...
}

Objektinitialisierer
Objekte werden ja normalerweise Konstruktoren oder Properties initialisiert. Das funktioniert in C# 3.0 etwas einfacher. Das ist aber keine Magie, auch keine neuen MSIL Anweisungen. Der Compiler wandelt es um und ruft einfach nur die Setter auf.

Person person = new Person { FirstName = "Max", LastName = "Mustermann" };

Die Konstruktorklammern müssen nicht, können aber mitgeschrieben werden. Es kann auch ein benutzerdefinierter Konstruktor erstellt werden, um die Initialisierung eines Members zu erzwingen.

Collectioninitialisierer
Wie es Objektinitialisierer gibt, gibt es auch Collectioninitialisierer. Was nun selbsterklärend sein sollte.

List<Person> persons = new List<Person>
{
    new Person { FirstName = "Max", LastName = "Mustermann" },
    new Person { FirstName = "Tina", LastName = "Tester" }
};

Implizit typisierte lokale Variablen
In C# 3.0 wird bzw. kann der Datentyp einer Variablen automatisch vom Compiler bestimmt werden. Dies geschieht über das Schlüsselwort var. Vorweg, diese Art der Zuweisung ist typsicher. Ist einer Variable einmal ein Typ vom Compiler zugewiesen worden, kann man dieser keinen anderen Datentyp mehr zuweisen.

var intValue = 1;
Console.WriteLine( intValue.GetType() ); // System.Int32
//intValue = 1.2; // Fehler

Es sind aber ein paar Dinge zu beachten.
- var darf nicht verwendet werden:
*als Member in Klassen und Strukturen

*als Funktionsparameter

*als Rückgabewert einer Funktion

  • var muss bei der Deklaration sofort initialisiert werden
    • var darf nicht mit null initialisiert werden

Anonyme Typen
Aus LINQ Abfragen können von Objekten einige, alle oder mehr Eigenschaften in einem neuen Objekt zurückgegeben werden.

Beispiel:

IEnumerable<PersonWithFullName> query = from c in customers
                                        select new PersonWithFullName
                                        {
                                            FirstName = c.FirstName,
                                            LastName = c.LastName,
                                            FullName = c.FirstName + " " + c.LastName
                                        };

Dafür habe ich eine Klasse PersonWithFullName geschrieben. Wie man sich schnell vorstellen kann, kann das sehr ausufernd werden und zu einer "Klassenexplosion" führen. Dafür wurden anonyme Typen eingeführt. Bei anonymen Typen legt der Compiler den Typ an.

var query = from c in customers
            select new { c.FirstName, c.LastName, FullName = c.FirstName + " " + c.LastName };

Es wird nach dem new einfach ein Objekt initilisiert und einer Variable mit dem Typ var zugewiesen. Daraus entsteht in diesem Fall ein IEnumerable<%TypDesAnonymenTypen%>.

Lambda Expressions
Der Nachfolger von anonymen Methoden. Eine Art Funktionszeiger. Das im ersten Moment auffälligste an einer Lambda Expression ist der Doppelpfeil ( => ). Links von dem Doppelpfeil steht die Parameterliste und rechts der Ausdruck. Der Rückgabetyp wird aus dem Typ des Ausdrucks bestimmt.

int[] values = { 1, 3, 4, 6, 88, 66, 453 };
Array.ForEach( values, i => Console.WriteLine( i ) );

Das i vom Typ int sein muss, kann der Compiler aus values ableiten. Diese Lambda Expression entspricht folgender anonymen Methode:

Array.ForEach<int>( values, delegate (int i) { Console.WriteLine(i); } );

Diese anonyme Methode kann man auch folgendermaßen ausdrücken.

Array.ForEach<int>( values, ShowNumbers );

private void ShowNumbers( int i )
{
    Console.WriteLine( i );
}

Weiteres Beispiel für Lambda Expressions:

( a, b ) => a + b
// Zwischenspeichern
Func<int, int, int> myFunc = ( a, b ) => a + b;

Func ist ein delegate der mit dem .NET Framework 3.5 eingeführt wird und in vielen Erweiterungsmethoden zum Einsatz kommt.

Bei den meisten Spracherweiterungen sieht man die Nützlichkeit und den Sinn wohl erst im Einsatz mit LINQ.

Suchhilfe: Spracherweiterung