verwendetes Datenbanksystem: SQLite (SQLite.Net 1.0.65, dann update auf 1.0.103.0)
Hallo zusammen,
ich habe vor ein paar Tagen begonnen ein Datenbankeditor für mein neues Android-Projekt mit C# und Visual Studio 2008 zu schreiben.
Soweit hat das auch alles gut funktioniert. Ich habe die Datenbank erstellt, ein ADO.Net Entity Data Model hinzugefügt und aus der Datenbank generieren lassen... alles kein Problem.
Dann hab ich den Fehler gemacht, mein SQLite.Net 1.0.65 auf Version 1.0.103.0 upzudaten, um im Connectionstring die Verwendung der foreign keys aktivieren zu können.
Das Programm läuft weiterhin und kann zur Laufzeit auch auf die Datenbank zugreifen. Auch aus Visual Studio kann ich mich mit der DB verbinden und z.B. die Tabelleninhalte auslesen.
Wenn ich jetzt aber meine .edmx Datei öffne und das Model aus der Datenbank aktualisieren möchte, dann erhalte ich die Fehlermeldung in dem angehängten Bild.
Ich bin langsam echt am verzweifeln und bin für jede Hilfe dankbar 🙂.
Hier noch ein paar weitere Infos, falls benötigt:
Auszug aus der machine.config:
<system.data>
<DbProviderFactories>
<add name="Odbc Data Provider" invariant="System.Data.Odbc" description=".Net Framework Data Provider for Odbc" type="System.Data.Odbc.OdbcFactory, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<add name="OleDb Data Provider" invariant="System.Data.OleDb" description=".Net Framework Data Provider for OleDb" type="System.Data.OleDb.OleDbFactory, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<add name="OracleClient Data Provider" invariant="System.Data.OracleClient" description=".Net Framework Data Provider for Oracle" type="System.Data.OracleClient.OracleClientFactory, System.Data.OracleClient, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<add name="SqlClient Data Provider" invariant="System.Data.SqlClient" description=".Net Framework Data Provider for SqlServer" type="System.Data.SqlClient.SqlClientFactory, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<add name="Microsoft SQL Server Compact Data Provider" invariant="System.Data.SqlServerCe.3.5" description=".NET Framework Data Provider for Microsoft SQL Server Compact" type="System.Data.SqlServerCe.SqlCeProviderFactory, System.Data.SqlServerCe, Version=3.5.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" /><add name="Microsoft SQL Server Compact Data Provider 4.0" invariant="System.Data.SqlServerCe.4.0" description=".NET Framework Data Provider for Microsoft SQL Server Compact" type="System.Data.SqlServerCe.SqlCeProviderFactory, System.Data.SqlServerCe, Version=4.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" />
<add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".NET Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite, Version=1.0.103.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
</DbProviderFactories>
</system.data>
Auszug aus der app.config:
<system.data>
<DbProviderFactories>
<remove invariant="System.Data.SQLite" />
<add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".NET Framework Data Provider for SQLite"
type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite, Version=1.0.103.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
</DbProviderFactories>
</system.data>
<connectionStrings>
<add name="DBContext"
connectionString="metadata=res://*/DBConnection.csdl|res://*/DBConnection.ssdl|res://*/DBConnection.msl;provider=System.Data.SQLite;provider connection string="data source=P:\Entwicklung\SQLite\Windows Binaries\app_de.db;foreign keys=True""
providerName="System.Data.EntityClient" />
</connectionStrings>
Hallo zusammen.
Ich würde gerne für eine satirisches Wahlprogramm (App) Bilder und Zitate (auch als Audio) von Politikern verwenden.
Weiß hier jemand wie das rechtlich aussieht, bzw. kennt sich mit dem Thema aus?
Soweit ich weiß dürfen Bilder und Zitate von öffentlichen Personen, was Politiker ja mit Sicherheit sind, z.B. für Werbung (siehe Sixt) verwendet werden.
Für Eure Meinung wäre ich sehr dankbar 😉.
Hallo zusammen,
ich hätte da mal eine Frage zum Thema Sortieren.
Ich habe eine Liste mit numerischen Werten, welchen teilweise noch Buchstaben vorangestellt sind.
Z.B.:*37488 *5881 *D 344 *1556 *D 1783 *D 1243
Wenn ich diese jetzt sortiere, erhalte ich folgende Reihenfolge:*1556 *37488 *5881 *D 1243 *D 1783 *D 344
Ich würde die Liste aber gerne so sortiert haben, das ich zuerst alle Zahlen ohne führenden Buchstaben habe und danach in alphabetischer Reihenfolge die übrigen Zahlen.
Die Zahlen sollen dabei nach Ihrem Wert sortiert werden, so dass die Liste so ausehen würde:
*1556
*5881
*37488
*D 344
*D 1243
*D 1783
Wie stell ich so eine Sortierung am Besten und einfachsten an?
Vielen Dank schonmal im vorraus 😃.
Ich habs jetzt über eine BindingList gelöst. Es war gar nicht so kompliziert wie ich gedacht habe.
Ich übertage einfach die Einträge meiner List<T> in die BindingList und lege diese dann als DataSource des DataGridViews fest.
Trotzdem wundert es mich, dass das DataGridView das Sortieren von einfachen Typen wie strings oder ints nicht von Hause aus unterstützt. Mit nicht datengebundenen Einträgen klappt es doch auch.
Ich danke Euch jedenfalls für die Tips.
@yngwie:
Das wäre auch schön einfach und einen Versuch wert gewesen aber als ich Deinen Post gelesen habe, hatte ich schon die BindingList implementiert 😉.
Ich habs befürchtet.
Ich hab jetzt nochmal ein bißchen gegoogelt aber so ganz verstehe ich das Problem nicht und warum man unbedingt eine BindingList braucht.
Würde es also theoretisch reichen wenn ich diesen Code:
List<UserKMAdresse> lstAlleAdressen = (from a
in context.UserKMAdresses
where a.UserKMKampagne_ID == this._activeKampagne.ID
select a).ToList();
so abändere:
BindingList<UserKMAdresse> lstAlleAdressen = (from a
in context.UserKMAdresses
where a.UserKMKampagne_ID == this._activeKampagne.ID
select a).ToList();
Quick and Dirty hat das zumindest zur gleichen Fehlermeldung geführt.
UserKMAdresse ist übrigens eine autogenerierte Linq-Klasse.
Sorry, war ein Copy & Paste Fehler in meinem Post. Es gibt verschieden Listen und je nach Benutzeraktion wird eine andere an das Datagridview gehängt. Der Code ist richtig, ich hab nur die falsche Stelle gepostet.
Edit: Ich hab das Codebeispiel geändert.
Ich packe eine Datenbankafrage in eine List<Z> und hänge diese dann ans Datagridview:
...
List<UserKMAdresse> lstAlleAdressen = (from a
in context.UserKMAdresses
where a.UserKMKampagne_ID == this._activeKampagne.ID
select a).ToList();
...
dgv.DataSource = lstAlleAdressen;
Wenn ich jetzt Sort aufrufe erhalte ich folgenden Fehler:> Fehlermeldung:
Das DataGridView-Steuerelement muss an ein IBindingList-Objekt gebunden sein, um sortiert zu werden.
Hallo zusammen,
ich schlage mich mal wieder mit der schönen Datagridview rum 😉.
Ich habe ein datengebundenes Datagridview und möchte dieses gerne nun per Klick auf einen Spaltenkopf sortieren können. Ich musste jetzt leider feststellen dass das gar nicht ohne weiteres möglich ist.
Die einzige Möglichkeit die ich bis jetzt gefunden habe ist eine BindingList zu verwenden. Das ist mir auf Grund der Daten und der Umstellung eines laufenden Programmes aber gar nicht recht.
Bevor ich eine Bindinglist verwende würde ich sogar eher die Daten erneut und entsprechend sortiert aus der Datenbank abfragen.
Daher die Frage, gibt es irgendeine andere Möglichkeit die Daten im Dateviewgrid zu sortieren?
Ich würde gerne Shader manuell unter XNA 4.0 kompilieren. Ich habe mich dabei an folgendem msdn-Artikel orientiert: Effect compilation and Content Pipeline automation in XNA Game Studio 4.0.
Das scheint auch zu funktionieren aber ich würde den kompilierten Shader gerne als xnb-Datei speichern. Dazu habe ich den byte-Array von GetEffectCode() einfach in eine Datei geschrieben aber das scheint nicht zu funktionieren, da ich beim Laden des Shader immer die Fehlermeldung bekomme, dass es sich um keine Shader-Datei handelt.
Wie kann ich den Shader denn korrekt speichern?
Hallo zusammen,
ich bin im Internet zufällig auf das XNA-Framework IceCream gestoßen (http://icecream.epsicode.net/).
Das Framework wird offensichtlich nicht weiterentwickelt aber in dem jetzigen Zustand sieht es schon recht vielversprechend aus. Das Problem ist, dass das beiliegende Projekt-Template für XNA 3.1 ist und nicht unter XNA 4.0 funktioniert. Es wird die Klasse Microsoft.Xna.GameStudio.Wizards.NestedProjectWizard verwendet, welche unter XNA 4.0 nicht mehr existiert.
Meine Versuche das Template zu konvertieren sind leider gescheitert. Könnte mir hier vieleicht jemand helfen oder sich mal die angehängte Datei ansehen und mir sagen wie die Konvertierung hinkriege?
Die aktuelle Fehlermeldung bezieht sich auf die Datei IceCreamWindowsGame.vstemplate und den Eintrag
<FullClassName>Microsoft.Xna.GameStudio.Wizards.NestedProjectWizard</FullClassName>
Laut msdn steht die Klasse NestedProjectWizard unter XNA 4.0 nicht mehr zur Verfügung.
Hier einmal die gesamte Datei IceCreamWindowsGame.vstemplate:
<VSTemplate Version="3.0.0" Type="Project" xmlns="http://schemas.microsoft.com/developer/vstemplate/2005">
<TemplateData>
<Name>IceCreamWindowsGame</Name>
<Description>A custom Game Studio project</Description>
<Icon>_xgstemplate.ico</Icon>
<ProjectType>CSharp</ProjectType>
<RequiredFrameworkVersion>2.0</RequiredFrameworkVersion>
<SortOrder>100</SortOrder>
<CreateNewFolder>true</CreateNewFolder>
<DefaultName>IceCreamWindowsGame</DefaultName>
<ProvideDefaultName>true</ProvideDefaultName>
<PromptForSaveOnCreation>true</PromptForSaveOnCreation>
</TemplateData>
<TemplateContent>
<Project File="IceCreamWindowsGame.csproj" ReplaceParameters="true">
<Folder Name="Properties" TargetFolderName="Properties">
<ProjectItem ReplaceParameters="true" TargetFileName="AssemblyInfo.cs">AssemblyInfo.cs</ProjectItem>
</Folder>
<ProjectItem ReplaceParameters="true" TargetFileName="Program.cs">Program.cs</ProjectItem>
<ProjectItem ReplaceParameters="true" TargetFileName="Game.icproj">Game.icproj</ProjectItem>
<ProjectItem ReplaceParameters="true" TargetFileName="Game1.cs">Game1.cs</ProjectItem>
<ProjectItem ReplaceParameters="false" TargetFileName="Game.ico">Game.ico</ProjectItem>
<ProjectItem ReplaceParameters="false" TargetFileName="GameThumbnail.png">GameThumbnail.png</ProjectItem>
</Project>
</TemplateContent>
<WizardExtension>
<Assembly>Microsoft.Xna.GameStudio, Version=2.0.0.0, Culture=neutral, PublicKeyToken=6d5c3888ef60e27d</Assembly>
<FullClassName>Microsoft.Xna.GameStudio.Wizards.NestedProjectWizard</FullClassName> <------ FEHLER FEHLER FEHLER
</WizardExtension>
<WizardData>
<Folder Name="Content" TargetFolderName="Content">
<ProjectItem ReplaceParameters="true" TargetFileName="Content.contentproj">Content.contentproj</ProjectItem>
<ProjectItem ReplaceParameters="false" TargetFileName="global.ice">global.ice</ProjectItem>
<ProjectItem ReplaceParameters="false" TargetFileName="TestScene.icescene">TestScene.icescene</ProjectItem>
</Folder>
</WizardData>
</VSTemplate>
Vielen Dank für jede Hilfe im vorraus 😃
Moin moin und erstmal Danke für die Antwort 😃.
Ich hab schon ein wenig mit XNA gearbeitet aber das wird das erste größere Projekt. Daher die Frage nach den Best Practices.
Das Moon Taxi Tutorial hab ich mir schon angeschaut und das ist soweit auch kein Thema. Leider scrollt da aber nix und es wird auch keine Physic-Engine verwendet 😉.
Nach Content Pipeline werde ich jetzt gleich nochmal etwas googlen 😉.
Hallo zusammen,
ich würde gerne ein Spiel programmieren und zwar einen Sidescroller mittels XNA.
Bevor ich aber loslege wollte ich mir noch ein paar Meinungen zum generellen Design einholen 😉.
Ich würde gerne eine Physik-Engine benutzen und momentan tendiere ich zu Farseer. Die Engine möchte ich hauptsächlich für Ragdoll-Effekte, Partikel und Collision-Detection verwenden.
Ist es darüber hinaus sinnvoll die Spielfigur und die Gegner per Physikengine steuern zu lassen, z.B. mit AddForce() oder ähnlich für die Bewegung, Sprünge etc. oder sollte man das lieber selber programmieren?
Wie sollte ich beim Laden des Levels vorgehen? Das Level besteht aus unmengen Tiles, welche für die Collision-Detection wiederrum einen Physic-Body haben. Ich könnte mir vorstellen das es bei großen Leveln zu Performanceproblemen kommen könnte oder brauch ich mir da keine Sorgen zu machen? Wäre es sinnvoller nur den sichtbaren Bereich des Levels im Speicher zu halten und den Rest beim scrollen nachzuladen ohne das es zu rucklern kommt?
Falls man das ganze irgendwann einmal eventuell veröffentlichen wollte, z.B. über Steam, gibt es da ein paar Dinge die man von Anfang an beachten sollte? Z.B. verwendete Dlls, Speicherorte für Grafiken etc.?
Ich bin für alle Tips dankbar 😃.
Hallo Rhavin
Vorerst bezüglich der if Abfrage... :
>
Danke für den Link, da hab ich noch nie tiefer drüber nachgedacht 😉. Meistens lass ich das == true auch weg aber an manchen Codestellen finde ich es einfach leserlicher.
Bezüglich Linq:
Ich würde von der Hilfstabelle starten àlà
var qMedia = from m in context.Hilfstabelle where lstListe.Contains(x.Property) select new { } ....
Beste Grüsse
Diräkt
Gute Idee, das werde ich nachher mal ausprobieren 😃.
var lstMedias = context.Medias foreach (string genre in lstGenres) { lstMedias = from m in lstMedias where m.Name.StartsWith(startsWith.Trim()) && m.MediaGenres.Contains(genre) select m; } l.AddRange(lstMedias.Select(x => new new Wrapper.SuchWrapper { ID = m.ID, Data = m, Suchtyp = Enums.SUCHTYP.MEDIA }).ToList());
Das wird nicht funktionieren, da MediaGenres nur ein Objekt vom Typ MediaGenre nimmt. Das war auch mein 2. Ansatz 😃.
if (medias) { var qMedia = from m in context.Medias where m.Name.StartsWith(startsWith.Trim()) && m.MediaGenres.Where(x => lstGenres.Contains(x)).Count() == lstGenres.Count select new Wrapper.SuchWrapper { ID = m.ID, Data = m, Suchtyp = Enums.SUCHTYP.MEDIA }; l.AddRange(qMedia); }
Den Code verstehe ich nicht ganz. Was bezweckst Du mit dem Count()?
Euch Beiden auf jeden Fall vielen Dank für die Antworten 😃
verwendetes Datenbanksystem: MSSQL Server 2005
Hallo zusammen,
ich programmiere gerade ein kleines Mediencenter und habe ein Problem bei einer Linq2SQL-Abfrage.
Ich würde gerne meine Musik in diesem speziellen Fall nach Genres gefiltert anzeigen lassen. Dazu gibt es eine ListView mit Checkboxen und es sollen beim Suchen nur Lieder mit den ausgewählten Genres angezeigt werden.
Ein Lied hat n Genres und ist mit der Tabelle Genres über die Hilfstabelle MediaGenres verbunden. Da jedes Lied mehrere Genres haben kann und auch bei der Suche mehrere Genres verwendet werden können benötige ich dafür das entsprechende Select. Die Methode Contains() nimmt leider keine Liste, sondern nur ein Argument an, daher wäre ich für jede Hilfe bei meiner Abfrage dankbar 😃!
Hier noch ein kleiner Auszug aus meinem bisherigen Suchcode:
...
if (medias == true)
{
var qMedia = from m in context.Medias
where m.Name.StartsWith(startsWith.Trim())
// && m.MediaGenres.Contains(lstGenres) // geht nicht, da Contains keine Überladung für eine Liste enthält
select new Wrapper.SuchWrapper { ID = m.ID, Data = m, Suchtyp = Enums.SUCHTYP.MEDIA };
l.AddRange(qMedia);
}
...
Hat sich erledigt, hab ausversehen das falsche DataGridView verwendet 😉.
Das Speichern der Referenz reicht.
Nabend zusammen.
Ich verwende ein datengebundenes Datagridview um Suchergebnisse aus einer Datenbank anzuzeigen.
Jetzt würde ich gerne eine Historienfunktion impementieren (undo/redo) um auf zuvor gefundene Ergebnisse vor und zurückblättern zu können.
Dazu speicher ich die alte DataSource des Datagridviews in einer List<T>, sobald eine neue DataSource zugewiesen wird. Das Problem, die gespeicherten Ergebnisse werden automatisch null, sobald dem DataGridView neue Daten zugewiesen werden.
Was muss ich beachten, um die alten Daten zwischenspeichern zu können?
Hier der Code des Zwischenspeicherns:
// CList impementiert IList<T> und stellt eine Begrenzung der Liste und eine Benachrichtung bei geänderten Daten bereit.
this._lstSucheHistorie = new CList<object>(10);
this._lstSucheHistorie.DataChanged += new CList<object>.DataChangedEventHandler(SuchHistorieDataChanged);
...
private void SaveOldBindingSource()
{
if (dgViewSuchen.DataSource != null)
{
this._lstSucheHistorie.Add(dgViewSuchen.DataSource);
}
}
...
private void Suchen(Wrapper.SuchWrapper wrapper)
{
if (wrapper.Suchtyp == Enums.SUCHTYP.INTERPRET)
{
SaveOldBindingSource();
dgViewSuchen.DataSource = DBHelper.Suchen((Interpret) wrapper.Data);
}
...
}
Wie macht dass denn dann z.B. Die DataGridViewComboBoxColumn? Die zeichnet das DropDown-Element doch auch außerhalb der Zelle?
Nachtrag:
Ich hab nochmal etwas rumpropiert und das EditingControl wird zwar in der Zelle gezeichnet aber das Control ist größer als die Zelle und alles was außerhalb der Zelle liegt wird abgeschnitten und nicht gezeichnet. Die Frage ist nur: warum 😃?
Hallo herbivore.
> ](http://www.mycsharp.de/wbb2/thread.php?threadid=26594) Punkt 4a.){gray}
Ist aber wirklich nicht der Fall 😃. Ich hab schon gegoogelt wie blöde und vieles ausprobiert... hat aber nicht geklappt. Daher dachte ich, es wäre sinnvoll den Ursprungscode zu posten.
Laut google ist das mit einem UserControl wohl nicht so einfach möglich, daher probiere ich es gerade einfach mit einer "normalen" DataGridViewRow und der Behandlung der Cell_BeginEdit und Cell_EndEdit Ereignisse, was im Ansatz auch schon klappt. Allerdings fände ich eine Lösung über eine eigene DataGridViewRow sauberer und besser.
Im Dateianhang sind die Screenshots wie es bei msdn ausschaut (links) und wie es bei mir ausschauen soll (rechts). Das UserControl ist nur grob entworfen und macht noch nichts.
Hallo,
ich versuche gerade eine eigene DataGridViewColumn zu erstellen, welche als EditingControl ein eigenes, komplexes UserControl anzeigt. Leider bekomme ich das nicht ganz hin. Das Beispiel aus der msdn (Build a Custom NumericUpDown Cell and Column for the DataGridView Control - Cell, Column and Editing Control Classes) habe ich hinbekommen aber mein eigenes UserControl wird nicht angezeigt.
Hier mal mein Code:
InterpretColumn:
class InterpretColumn: DataGridViewTextBoxColumn
{
public InterpretColumn():base()
{
this.CellTemplate = new InterpretCell();
}
public override DataGridViewCell CellTemplate
{
get
{
return base.CellTemplate;
}
set
{
if (value != null &&
!value.GetType().IsAssignableFrom(typeof(InterpretCell)))
{
throw new InvalidCastException("Must be a InterpretCell");
}
base.CellTemplate = value;
}
}
}
InterpretCell:
class InterpretCell: DataGridViewTextBoxCell
{
public override Type EditType
{
get { return typeof(InterpretEditingControll); }
}
public override Type ValueType
{
get { return typeof(String); }
}
public override bool KeyEntersEditMode(KeyEventArgs e)
{
return base.KeyEntersEditMode(e);
}
public override void InitializeEditingControl(int rowIndex, object initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle)
{
base.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle);
InterpretEditingControll ctrl = DataGridView.EditingControl as InterpretEditingControll;
}
private Rectangle GetAdjustedEditingControlBounds(Rectangle editingControlBounds, DataGridViewCellStyle cellStyle)
{
editingControlBounds.X += 1;
editingControlBounds.Width = Math.Max(0, editingControlBounds.Width - 2);
// Adjust the vertical location of the editing control:
int preferredHeight = cellStyle.Font.Height + 3;
if (preferredHeight < editingControlBounds.Height)
{
switch (cellStyle.Alignment)
{
case DataGridViewContentAlignment.MiddleLeft:
case DataGridViewContentAlignment.MiddleCenter:
case DataGridViewContentAlignment.MiddleRight:
editingControlBounds.Y += (editingControlBounds.Height - preferredHeight) / 2;
break;
case DataGridViewContentAlignment.BottomLeft:
case DataGridViewContentAlignment.BottomCenter:
case DataGridViewContentAlignment.BottomRight:
editingControlBounds.Y += editingControlBounds.Height - preferredHeight;
break;
}
}
return editingControlBounds;
}
public override void PositionEditingControl(bool setLocation, bool setSize, Rectangle cellBounds, Rectangle cellClip, DataGridViewCellStyle cellStyle, bool singleVerticalBorderAdded, bool singleHorizontalBorderAdded, bool isFirstDisplayedColumn, bool isFirstDisplayedRow)
{
base.PositionEditingControl(setLocation, setSize, cellBounds, cellClip, cellStyle, singleVerticalBorderAdded, singleHorizontalBorderAdded, isFirstDisplayedColumn, isFirstDisplayedRow);
Rectangle editingControlBounds = PositionEditingPanel(cellBounds,
cellClip,
cellStyle,
singleVerticalBorderAdded,
singleHorizontalBorderAdded,
isFirstDisplayedColumn,
isFirstDisplayedRow);
editingControlBounds = GetAdjustedEditingControlBounds(editingControlBounds, cellStyle);
this.DataGridView.EditingControl.Location = new Point(editingControlBounds.X, editingControlBounds.Y);
this.DataGridView.EditingControl.Size = new Size(editingControlBounds.Width, editingControlBounds.Height);
}
public override void DetachEditingControl()
{
base.DetachEditingControl();
}
protected override object GetFormattedValue(object value, int rowIndex, ref DataGridViewCellStyle cellStyle, System.ComponentModel.TypeConverter valueTypeConverter, System.ComponentModel.TypeConverter formattedValueTypeConverter, DataGridViewDataErrorContexts context)
{
return base.GetFormattedValue(value, rowIndex, ref cellStyle, valueTypeConverter, formattedValueTypeConverter, context);
}
protected override Size GetPreferredSize(Graphics graphics, DataGridViewCellStyle cellStyle, int rowIndex, Size constraintSize)
{
return base.GetPreferredSize(graphics, cellStyle, rowIndex, constraintSize);
}
InterpretEditingControl:
public partial class InterpretEditingControll : UserControl, IDataGridViewEditingControl
{
DataGridView datagridview;
private bool valueChanged = false;
int rowIndex;
public InterpretEditingControll()
{
InitializeComponent();
this.TabStop = false;
}
#region IDataGridViewEditingControl Members
public void ApplyCellStyleToEditingControl(DataGridViewCellStyle dataGridViewCellStyle)
{
this.Font = dataGridViewCellStyle.Font;
}
public DataGridView EditingControlDataGridView
{
get { return datagridview; }
set { datagridview = value; }
}
public object EditingControlFormattedValue
{
get
{
return "Hallo";
}
set
{
//toDo
}
}
public int EditingControlRowIndex
{
get { return rowIndex; }
set { rowIndex = value; }
}
public bool EditingControlValueChanged
{
get { return valueChanged; }
set { valueChanged = value; }
}
public bool EditingControlWantsInputKey(Keys keyData, bool dataGridViewWantsInputKey)
{
return true;
}
public Cursor EditingPanelCursor
{
get { return base.Cursor; }
}
public object GetEditingControlFormattedValue(DataGridViewDataErrorContexts context)
{
return EditingControlFormattedValue;
}
public void PrepareEditingControlForEdit(bool selectAll)
{
}
public bool RepositionEditingControlOnValueChange
{
get { throw new NotImplementedException(); }
}
#endregion
}
Das das EditingControl noch nichts macht ist mir klar, ich möchte einfache nur das UserControl angezeigt bekommen wenn ich die Zelle editiere aber das krieg ich nicht hin. Bin daher für jede Hilfe sehr dankbar 😃.
Klappt 😃.... vielen Dank 😃.
... parameters.ReferencedAssemblies.Add("mscorlib.dll"); //parameters.ReferencedAssemblies.Add("System.Data.Linq.dll"); => Fehler ...
Und welcher Fehler tritt an genau der Stelle auf?
Es kommt folgende Fehlermeldung> Fehlermeldung:
Die Metadatendatei System.Data.Linq.dll konnte nicht gefunden werden.
EDIT: Ah, ok, du musst den Verweis bei CodeDom hinzufügen. Kommt der Fehler, den zu gezeigt hast, wenn du die bewusste Zeile ein- oder auskommentiert hast? Kommt ein anderer Fehler wenn die Zeile andersherum ein- bzw. auskommentiert ist?
Der Fehler kommt wenn die Zeile auskommtiert ist. Wenn die Zeile nicht auskommentiert ist, dann kommt er gar nicht so weit sonder wirft den oben stehenden Fehler.
Wenn ich die Foreach-Schleife im Skript auskommentiere klappt es. Ich habe zum Testen den Code des Skripts auchmal komplett in eine Testklasse innerhalb des Projektes kopiert und da läuft er auch fehlerfrei.
Hallo zusammen,
ich versuche ein Script per CodeDomProvider auszuführen und ich erhalte folgende Fehlermeldung:> Fehlermeldung:
Der Typ System.Data.Linq.EntitySet`1<T0> ist in einer Assembly, auf die nicht verwiesen wird, definiert. Fügen Sie einen Verweis zur Assembly System.Data.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 hinzu.
Wie kann ich ein Verweis auf Linq hinzufügen?
Hier ein Auszug aus dem Skript:
// Media und InterpretMedia sind Linq2SQL Objekte
public static String GetSongText(Media media)
{
String source = null;
foreach (InterpretMedia im in media.InterpretMedias)
{
source = GetSongText(im.Interpret.Name, media.Name);
if (source != null)
break;
}
if ((source == null) || source.Length < 1)
return null;
...
}
und hier der Aufruf:
...
CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");
CompilerParameters parameters = new CompilerParameters();
parameters.ReferencedAssemblies.Add("System.dll");
parameters.ReferencedAssemblies.Add("System.Drawing.dll");
parameters.ReferencedAssemblies.Add("System.Windows.Forms.dll");
parameters.ReferencedAssemblies.Add("MediaCenter.exe");
parameters.ReferencedAssemblies.Add("MediaCenter.vshost.exe");
parameters.ReferencedAssemblies.Add("mscorlib.dll");
//parameters.ReferencedAssemblies.Add("System.Data.Linq.dll"); => Fehler
parameters.GenerateInMemory = true;
CompilerResults results = provider.CompileAssemblyFromFile(parameters, new String[] {file});
...
Für Skripts die kein Linq brauchen funktioniert es übrigens wunderbar
Ich hab nochmal länger gegooglet.
Kann ich nicht zur Laufzeit die OnPaint-Methode meines Objektes ermitteln und durch eine andere ersetzen? In etwa so:
Button b = new Button();
MethodInfo mf = b.GetType().GetMethod("OnPaint", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static);
mf ist in diesem Beispiel leider immer NULL aber müsste es nicht so irgendie gehen? Hat vielleicht jemand noch in diese Richtung eine Idee?
Das war ja meine Frage vorhin ob Du das zur Lauf- oder Designzeit meinst.
Meine Buttons alle in ButtonBase (zur Designzeit) umzustellen möchte ich ja auf jeden Fall vermeiden. Das Programm hat zur Zeit an die 100 Buttons, die möchte ich nicht alle auf ButtonBase umstellen. Hinzu kommt noch, dass das nachträgliche Skinnen der Form optional ist. Die Buttons sollten, wenn kein Skin ausgewählt ist auch als Button gezeichnet werden.
Der Button ist hier ja außerdem nur der aktuelle Fall. Es sollen aber auch alle anderen Steuerelemente geändert werden können. Da müsste ich eventuell auch das OnPaint überschreiben oder zur Laufzeit ableiten.
Ich hab sowas ähnliches mal mit C++, Hooks und Subclassing für fremde Programme gemacht. Das ist aber für meine Zwecke jetzt ein bißchen von hinten durch die Brust und zu unflexible und aufwändig.
Ich hab jetzt mal ein bißchen mit ButtonBase rumgespielt aber entweder krieg ich es nicht hin oder ich verstehe nicht genau was Du meinst.
Ich hab jetzt z.B. mal folgendes ausprobiert:
else if (c.GetType() == typeof(Button))
{
ButtonBase b = (ButtonBase)c;
b.Paint += new PaintEventHandler(delegate(object sender, PaintEventArgs e)
{
Pen blackPen = new Pen(Color.Black, 3);
Rectangle rect = new Rectangle(0, 0, 200, 200);
e.Graphics.DrawRectangle(blackPen, rect);
});
}
Es gibt aber keinen Unterscheid wenn ich nur Button verwende.
Ich glaube, dafür kannst du ButtonBase gut verwenden. Also erstelle dir eine Klasse, die davon ableitet.
Meinst Du jetzt zur Laufzeit ableiten? Falls ja wäre das ja auch prima aber wie mache ich das? Google hat mir dabei nicht geholfen.
Zur Design-Zeit die Basisklasse zu verwenden geht nicht, da ich mich ja dann wieder auf eine Klasse festlege.
Hallo herbivore,
ich möchte eine Skin-Funktionalität per Skript zur Verfügung stellen. Das Skript wird zur Laufzeit kompiliert und auf die entsprechende Form angewendet. Der Code sieht im Skript z.B. so aus:
public void Skin(Form frm)
{
frm.BackColor = Color.Black;
foreach (Control c in frm.Controls)
{
if (c.GetType() == typeof(TextBox))
{
((TextBox)c).BackColor = Color.Orange;
}
...
else if (c.GetType() == typeof(Button))
{
Button b = (Button)c;
b.Paint += new PaintEventHandler(delegate(object sender, PaintEventArgs e)
{
Pen blackPen = new Pen(Color.Black, 3);
Rectangle rect = new Rectangle(0, 0, 200, 200);
e.Graphics.DrawRectangle(blackPen, rect);
});
}
}
frm.Paint += new PaintEventHandler(delegate(object sender, PaintEventArgs e)
{
int gradientHeight = 90;
Form form = (Form)sender;
Rectangle rect = new Rectangle(new Point(0, form.Height - gradientHeight), new Size(form.Width, gradientHeight));
LinearGradientBrush brush = new LinearGradientBrush(rect, Color.LightGray, Color.LightGray, 0.0F);
e.Graphics.FillRectangle(brush, rect);
rect = new Rectangle(new Point(0, form.Height - gradientHeight), new Size(form.Width, 1));
brush = new LinearGradientBrush(rect, Color.Black, Color.DarkOrange, 0.0F);
e.Graphics.FillRectangle(brush, rect);
});
}
Das Problem ist in diesem Fall der Button:
else if (c.GetType() == typeof(Button))
{
Button b = (Button)c;
b.Paint += new PaintEventHandler(delegate(object sender, PaintEventArgs e)
{
Pen blackPen = new Pen(Color.Black, 3);
Rectangle rect = new Rectangle(0, 0, 200, 200);
e.Graphics.DrawRectangle(blackPen, rect);
});
}
Wenn ich nur einen neuen EventHandler für das Paint-Ereignis hinzufüge ist das Ergebnis nicht so doll, da der Button immer noch vom System gezeichnet wird. Ich möchte Ihn aber komplett selber zeichnen, da ich dann alle Freiheiten habe.
Falls es eine bessere Lösung gibt bin ich natürlich auch nicht abgeneigt 😃.
Moin moin 😃.
Ich würde gerne zur Laufzeit die OnPaint-Methode der Klasse Button mit User-Code überschreiben.
Geht das irgendwie? Kann ich Alternativ den Button zur Laufzeit von einer anderen Klasse ableiten?
Das könnte natürlich der Grund sein 😃. Danke für die Antwort.
Ich werde dann mal eine StoredProcedure schreiben die ein INSERT ohne NULL-Werte macht 😃.
Ups, hab vergessen zu erwähnen, dass ich Linq2SQL verwende 😉. Es ist eine autogenerierte Klasse:
...
[Column(Storage="_MediaTypStandartAbspielprioritaet", DbType="VarChar(7)", CanBeNull=false)]
public string MediaTypStandartAbspielprioritaet
{
get
{
return this._MediaTypStandartAbspielprioritaet;
}
set
{
if ((this._MediaTypStandartAbspielprioritaet != value))
{
this.OnMediaTypStandartAbspielprioritaetChanging(value);
this.SendPropertyChanging();
this._MediaTypStandartAbspielprioritaet = value;
this.SendPropertyChanged("MediaTypStandartAbspielprioritaet");
this.OnMediaTypStandartAbspielprioritaetChanged();
}
}
}
...
Den Standardwert "1;2;3;4" habe ich im Management Studio in der Datenbank hinterlegt:
[MediaTypStandardAbspielprioritaet] varchar NOT NULL CONSTRAINT [DF_Einstellungen_MediaTypStandardAbspielprioritaet] DEFAULT ('1;2;3;4').
Vielleicht stehe ich ja gerade völlig auf dem Schlauch aber nach meinem Verständnis sollte die DB selbstständig den Default-Wert "1;2;3;4" eintragen, falls ich im Code den Wert nicht setze.... Default-Wert halt.
So... muss morgen früh wieder fit für die Arbeit sein, daher hau ich mich jetzt erstmal hin. Danke für Deine Hilfe!
Nein. Das funktioniert nur, wenn du KEINEN Wert angibst. Wenn du null übergibst, wird er auch versuchen, Null in die Spalte zu schreiben und das führt zu dieser Exception.
Sorry, vielleicht bin ich ja gerade völlig blöd aber ich übergebe doch keinen Wert.
Ich leg ein neues Objekt an und möchte es mit den Standardwerten in der DB speichern:
_einstellungen = new Einstellungen();
context.Einstellungens.InsertOnSubmit(_einstellungen);
context.SubmitChanges();
Der Defaultwert sollte aus der Datebank selbst kommen:
CREATE TABLE [dbo].[Einstellungen](
[MediaPath] [text] NULL,
[BildPath] [text] NULL,
...
[MediaTypStandardAbspielprioritaet] [varchar](7) NOT NULL CONSTRAINT [DF_Einstellungen_MediaTypStandardAbspielprioritaet] DEFAULT ('1;2;3;4'),
...
Was ist _einstellungen? Steht da vielleicht in der entsprechenden Spalte null drin?
_einstellungen ist einfach ein statisches Datebankobjekt. Es wird zuerst versucht die Einstellungen aus der Datenbank auszulesen.
_einstellungen = context.Einstellungens.FirstOrDefault();
Klappt das nicht, so sollen die Einstellungen neu in die Datenbank geschrieben werden (Mit den in der Datenbank hinterlegten Standardwerten).
if (_einstellungen == null)
{
_einstellungen = new Einstellungen();
context.Einstellungens.InsertOnSubmit(_einstellungen);
context.SubmitChanges();
}
verwendetes Datenbanksystem: MSSQL Server 2005
Guten Abend 😃.
Ich habe in meiner Datenbank eine Tabelle für die Einstellungen meines Programmes. Beim 1. Start wird geprüft ob bereits Einstellungen vorliegen. Falls nicht wird ein neuer Datensatz eingefügt, welcher mit Standarwerten aus der Datenbank gefüllt wird. Genau hier liegt mein Problem. Ich erhalte beim Einfügen des Datensatze folgende Exception:
Fehlermeldung:
System.Data.SqlClient.SqlException
Der Wert NULL kann in die 'MediaTypStandardAbspielprioritaet'-Spalte, 'MediaCenter_Neu2.dbo.Einstellungen'-Tabelle nicht eingefügt werden. Die Spalte lässt NULL-Werte nicht zu. Fehler bei INSERT. Die Anweisung wurde beendet.
Die Spalte ist wie folgt definiert:
[MediaTypStandardAbspielprioritaet] [varchar](7) NOT NULL CONSTRAINT [DF_Einstellungen_MediaTypStandardAbspielprioritaet] DEFAULT ('1;2;3;4'),
Und hier der C#Code:
...
private static Einstellungen _einstellungen;
public static void Init()
{
try
{
using (DBContext context = new DBContext())
{
_einstellungen = context.Einstellungens.FirstOrDefault();
if (_einstellungen == null)
{
_einstellungen = new Einstellungen();
context.Einstellungens.InsertOnSubmit(_einstellungen);
context.SubmitChanges();
}
}
}
catch (Exception e)
{
TraceMaster.HandleException(e, "Einstellungen konnten nicht initialisiert werden");
}
}
...
Wenn ich über das Managament Studio eine neue Zeile in die Tabelle einfüge klappt das wunderbar, nur nicht über meinen Code. Hat jemand eine Ahnung wo mein Problem liegt?
Ich hab mir Bass.net mal runtergeladen und werde es mal die Tage testen 😃.
Gibt es sowas auch für Video-Streams und Video-Dateien?
Hallo,
ich habe mir eine eigene DataGridViewColumn und DataGridViewCell erstellt, weche den Text je nach vorliegenden Daten formatiert anzeigen sollen.
Da ich von DataGridViewTextboxColumn und DataGridViewTextboxCell abgeleitet habe würde ich einfache gerne den Cellstyle, also die Hintergrundfarbe und die Schriftart ändern.
Dazu habe ich ich erstmal ohne Datenauswertung die Methode GetFormattedValue überschrieben um dort den Cellstyle zu ändern. Die Änderung wird zwar angezeigt aber das Datagridview flackert nun extrem. Also denke ich, ist die Änderung in der Methode GetFormattedValue nicht richtig aufgehoben aber wo packe ich die am besten hin?
Hier mal der Code:
class FormattedSearchTextCell: DataGridViewTextBoxCell
{
public FormattedSearchTextCell(): base() { }
protected override object GetFormattedValue(object value, int rowIndex, ref DataGridViewCellStyle cellStyle, System.ComponentModel.TypeConverter valueTypeConverter, System.ComponentModel.TypeConverter formattedValueTypeConverter, DataGridViewDataErrorContexts context)
{
DataGridViewCellStyle style = new DataGridViewCellStyle();
style.BackColor = Color.Green;
Font font = new Font(cellStyle.Font, FontStyle.Italic);
style.Font = font;
this.Style = style;
return base.GetFormattedValue(value, rowIndex, ref cellStyle, valueTypeConverter, formattedValueTypeConverter, context);
}
}
class FormattedSearchTextColumn: DataGridViewTextBoxColumn
{
public FormattedSearchTextColumn(): base()
{
this.CellTemplate = new FormattedSearchTextCell();
}
public override DataGridViewCell CellTemplate
{
get
{
return base.CellTemplate;
}
set
{
if (value != null &&
!value.GetType().IsAssignableFrom(typeof(FormattedSearchTextCell)))
{
throw new InvalidCastException("Must be a FormatedSearchTextCell");
}
base.CellTemplate = value;
}
}
}
Danke schön, klappt wunderbar 😃.
Hallo herbivore,
sorry für die ungenaue Fehlerbeschreibung. Ich werde das beim nächsten mal beachten.
Ich habe es jetzt mit CreateDelegate probiert, ich erhalte aber eine > Fehlermeldung:
System.ArgumentException: Fehler beim Binden an die Zielmethode.
Hier der Code:
...
oInstance = assembly.CreateInstance("MediaCenter.Skins.Test");
methodInfo = oInstance.GetType().GetMethod("Paint");
form.Paint += (PaintEventHandler)Delegate.CreateDelegate(typeof(PaintEventHandler), methodInfo);
...
Der Fehler wird in der letzten Zeilte geworfen.
P.S. Danke für den Hinweis mit dem 'On'. Ich habe die Methode umbenannt.
Ich versuche gerade eine Skin-Funktionalität für ein Projekt zu implementieren. Das Aussehen der Forms etc. soll per Skript verändert werden können, welches zur Laufzeit kompiliert wird.
Ich habe jetzt folgende Script-Test-Klasse:
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Drawing.Drawing2D;
namespace MediaCenter.Skins
{
class Test
{
public Color GetBackGroundColor()
{
return Color.Black;
}
public void OnPaint(object sender, PaintEventArgs e)
{
int gradientHeight = 90;
Form form = (Form)sender;
Rectangle rect = new Rectangle(new Point(0, form.Height - gradientHeight), new Size(form.Width, gradientHeight));
LinearGradientBrush brush = new LinearGradientBrush(rect, Color.Orange, Color.Black, 0.0F);
e.Graphics.FillRectangle(brush, rect);
rect = new Rectangle(new Point(0, form.Height - gradientHeight), new Size(form.Width, 1));
brush = new LinearGradientBrush(rect, Color.White, Color.Black, 0.0F);
e.Graphics.FillRectangle(brush, rect);
}
}
}
Diese wird wie folgt eingelesen, kompiliert und aufgerufen:
public static Assembly LoadScript(string file)
{
CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");
CompilerParameters parameters = new CompilerParameters();
parameters.ReferencedAssemblies.Add("System.dll");
parameters.ReferencedAssemblies.Add("System.Drawing.dll");
parameters.ReferencedAssemblies.Add("System.Windows.Forms.dll");
parameters.GenerateInMemory = true;
CompilerResults results = provider.CompileAssemblyFromFile(parameters, new String[] {file});
if (results.Errors.Count > 0)
{
WarnungHandler.Add("Fehler beim kompilieren des Scripts für '" + file + "'");
foreach (CompilerError error in results.Errors)
{
WarnungHandler.Add(error.ErrorText);
}
_assembly = null;
return null;
}
_assembly = results.CompiledAssembly;
return _assembly;
}
...
public static void SkinMe(Form form)
{
try
{
Assembly assembly = ScriptEngine.Assembly;
if (assembly == null)
return;
//geht
object oInstance = assembly.CreateInstance("MediaCenter.Skins.Test");
MethodInfo methodInfo = oInstance.GetType().GetMethod("GetBackGroundColor");
form.BackColor = (System.Drawing.Color)methodInfo.Invoke(oInstance, null);
//geht nicht?
oInstance = assembly.CreateInstance("MediaCenter.Skins.Test");
methodInfo = oInstance.GetType().GetMethod("OnPaint");
// form.Paint += (PaintEventHandler)methodInfo.MethodHandle;
}
catch (Exception e)
{
Tracing.TraceMaster.HandleException(e, "Fehler");
}
}
Das Zuweisen der BackColor klappt wunderbar, nur das Zuweisen des OnPaint-Eventhandlers klappt nicht. Kann mir bitte jemand sagen, wie ich das richtig zuweise?
Bin für jeden Tip sehr dankbar 😃.
Danke, werde mir das morgen dann mal näher anschauen 😃.
Danke für die fixe Antwort 😉.
Es handelt sich um eine überschaubare Datenbank für private Zwecke, also nix großes 😃.
Ich habe diese 3 Schlüssel noch nie bewusst gesehen. Ich arbeite ja in der Regel nur mit den Spaltennamen.
Ich werde dann mal die Indizes setzen und mich bei Gegenheit ein bißchen Tiefer in die Materie einarbeiten 😉.
Hi gfoidl,
vielen Dank erstmal für Deine schnelle Antwort 😃.
Bis jetzt mach ich das über das Management Studio aber gerade bei Abhängikeiten über mehere Tabellen ist das eine Qual.
Kannst Du mich mal in die richtige Richtung stupsen, wie ich das über Reflections lösen kann?
verwendetes Datenbanksystem: MSSQL
Ich würde gerne zum debuggen den kompletten Datenbankinhalt in eine Textdatei welcher Art auch immer schreiben.
Gibt es dazu für Linq2SQL eine einfache Möglichkeit alle Datensätze aus allen Tabellen auszulesen?
Ich könnte das natürlich manuell für jede Tabelle einzeln machen aber das wäre etwas aufwendig. Gibt es eine einfachere Möglichkeit?
verwendetes Datenbanksystem: MSSQL Server 2005
Hallo zusammen,
ich versuche gerade meine Datenbank mit dem MSSQL Server Management Studio Express zu optimieren und hätte dazu mal ein paar Fragen 😉.
Ich habe z.B. eine Tabelle Interpret und eine Tabelle Bild in einer m:n Beziehung. Daher hab ich eine Hilftabelle InterpretBild erstellt, welche nur die Primärschlüssel der beiden Tabelen Interpret und Bild enthält (als kombinierter Primärschlüssel).
Wenn ich mir die Tabelle InterpretBild im Management Studio anschaue, dann sehe ich unter Spalten meinen kombinierten Schlüssel InterpretID und Bild ID. Unter Schlüssel sehe ich drei Einträge PK_InterpretBild, FK_InterpretBild_Bild, FK_InterpretBild_Interpret. Wozu sind diese Einträge denn da?
Dann noch eine andere Frage. Macht es grundsätzlich Sinn einen Index auf eine Fremschlüsselspalte zu setzen. Gibt es eine Richtlinie ab welcher Menge Datensätze sich ein Index lohnt?
Guten Morgen 😃.
Hat jemand eine Idee ob und wie man einen Audio-Stream aus dem Internet über C# abspielen kann/könnte?
Ich würde gerne aus meinem Programm entweder ein Online-Radio abspielen oder Songs auf Simfy.
Es lag tatsächlich an der fehlenden Pluralisierungs-Einstellung auf einem der Rechner... Danke nochmal für Eure Hilfe 😃.
Danke 😃.
Ich werde nachher mal prüfen, ob es daran liegt.
Erstmal vielen Dank für Eure Antworten 😃.
Ich benutze LINQ2SQL und die Dinger die ich meine sind wohl die Navigation-Properties 😃
Also das es ein Fehler in der Datenbank ist, FK, PK etc. kann ich defitniv auschließen. Ich habe das Create-Script heute nochmal auf einem anderen Rechner eingespielt und da funktioniert alles tadellos.
Ich entwickel abwechelnd auf 2 Rechnern, je nachdem wo ich gerade bin und bei beiden hat es bis gestern funktioniert. Zumindest bewusst habe ich auf keinem Rechner irgendwelche Einstellungen geändert.
Wo stell ich denn die Pluralisierung im VS ein?
Im Warnungsfenster steht übrigens nichts.