// 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;
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.
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.
Bitte die Suche benutzen!
[FAQ] mehrere Programminstanzen verhindern (inkl. Parameterübergabe)
[...](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.
Such mal nach Nullable Types. Das ist ein Feature von .NET 2.0.
Meinst Du einen Blog im Internet oder ein Unterforum auf mycsharp?
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.
Du kannst im RowsDefaultCellStyle die SelectionBackColor auf Transparent setzen.
row.Cells["imageColumn"].Value = ...;
SELECT * FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
Du wirst wohl iterieren müssen.
grid.Columns[0].SortMode = DataGridViewColumnSortMode.NotSortable;
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 == "..."; });
Für den Bereich:
NOT LIKE '[A-Z]%'
Du musst Dir einen eigenen Provider schreiben, der auf Deine DB geht. Wie das funktioniert siehst Du ja in den Links.
Ist zwar ein Beispiel um den Wert einer Zelle zu setzen, aber das musst ja nur rumdrehen.
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.
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.
Einen Font erstellst Du über die Font Klasse.
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:
Die BindingSource zeigt die Daten nicht an, dass macht das Control. Sie verwaltet die Daten und kapselt zum Beispiel den CurrencyManager.
BindingSource verwendet man um Daten an ein Control zu binden, zum Beispiel ein DataGridView.
deineLetzteSpalte.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill;
Ein TextBox hat die Eigenschaft Text, aus der Du den Inhalt bekommst. Für einen Vergleich musst Du evtl. noch einen Cast durchführen.
Versuch mal:
private void dataGridView1_DragDrop( object sender, DragEventArgs e )
{
object[] rowArray = ((DataRowView)bindingSource[rowIndexFromMouseDown]).Row.ItemArray;
destinationTable.Rows.Add(rowArray);
}
Schau mal hier, vielleicht hilft Dir das.
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
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.
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;
}
Ja. Du kannst aber auch mit VS 2008 .NET 2.0 Programme schreiben.
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
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