DirectoryInfo.GetFiles() liefert dir keine Files von den Unterordnern. Wie es auch in der Dokumentation steht:
MSDN schrieb:
Returns a file list from the current directory.
Für die Lösung deines Problemes empfehle ich die Lektüre von dieser Seite:
DirectoryInfo.GetFiles(String, SearchOption)
Grüssli
Du kannst auch Image.FromFile weiterhin verwenden, musst aber halt einfach Image.Dispose aufrufen, wenn die Form geschlossen wird. Wie man dies auch in der Dokumentation nachlesen kann:
MSDN schrieb:
The file remains locked until the Image is disposed.
http://msdn.microsoft.com/en-us/library/stf701f5.aspx
Was du übrigens sowieso tun solltest, auch wenn du FileStream verwendest. Du erzeugst sonst ein mögliches Memory-Leak an GDI+ Handles.
Grüssli
Hallo qLab, ich hab mal ein kleines Testprojekt erstellt, welches Zellwerte ändert.
Der Code hier:
static void Main(string[] args)
{
DataTable dtData = new DataTable();
for (int i = 0; i < 10; i++)
dtData.Columns.Add("Spalte" + i.ToString(), typeof(int));
for (int i = 0; i < 10; i++)
{
Object[] values = new Object[dtData.Columns.Count];
for (int j = 0; j < dtData.Columns.Count; j++)
{
values[j] = i * j;
}
dtData.Rows.Add(values);
}
Console.WriteLine("Table created");
PrintTable(dtData);
Console.ReadLine();
Console.WriteLine("Updating cell values");
foreach (DataRow row in dtData.Rows)
{
foreach (DataColumn clm in dtData.Columns)
{
row[clm] = 12;
}
}
PrintTable(dtData);
Console.ReadLine();
}
private static void PrintTable(DataTable dtData)
{
foreach (DataRow row in dtData.Rows)
{
string sOutput = string.Empty;
foreach (DataColumn clm in dtData.Columns)
{
sOutput += String.Concat(clm.ColumnName, ": ", row[clm].ToString(), " - ");
}
Console.WriteLine(sOutput);
}
}
Nach der Änderung der Werte in den einzelnen Zellen, lasse ich mir diese ausgeben. Wie ich zuvor schon erwartet hatte, haben diese alle den Wert 12.
Machst du sonst noch etwas mit deiner Tabelle?
Da hast du natürlich Recht, man büßt ein gutes Stück Verallgemeinerung ein ;/ Ich hatte das damals gebraucht, um einen festen Satz an Methoden per Reflection auf verschiedene COM-Komponenten aufzurufen. Insofern war die Methodensignatur bei mir statisch
Mich interessiert aber auch, wieso Methode.Invoke sooo viel langsamer ist.. mal nach der Mittagspause forschen
Ich verwende eine COM Komponente.
Erstellt wird sie wie eine .NET Klasse:
ComComponent myCom = new ComComponent();
Beseitigt wird sie über:
System.Runtime.InteropServices.Marshal.ReleaseComObject(myCom );
Jetzt zeigt der Verweis von myCom aber immer noch irgendwo hin.
Bisher setzte ich ihn nach dem ReleaseComObject manuell auf "null".
Das mache ich aber nur, um abfragen zu können ob der Verweis noch mit dem RCW verwunden ist.
Weiß von Euch jemand, ob es eine elegantere Lösung zum Abfragen des Bestehens einer Verbindung zum RCW gibt?
Invoke führt das übergebene Delegat im GUI-Thread aus, und zwar synchron*. D.h. Dein Backgroundworker-Thread wird so lange blockiert, bis Invoke zurückkehrt. Ein Aufruf von Invoke ist auch relativ teuer.
Also wenn Du Tonnen von Berechnungen in einem Thread ausführst solltest Du nicht ständig versuchen die GUI zu aktualisieren, nur zu geschickt gewählten Zeitpunkten. Ein Mensch nimmt sowieso nicht so viele Änderungen pro Zeit wahr.
* Es gibt auch noch BeginInvoke zu asynchronen Ausführung
Ich habe eine Druckausgabe als image in einer Datei aufbereitet und will diese an den Drucker schicken.
Die Höhe ist grösser als die Breite. Ich wünsche Hochformat statt standardmässig angebotenem Querformat. Was muss ich ergänzen?
string Datei = "image01.png";
var printProcess = new Process();
printProcess.StartInfo.FileName = Datei;
printProcess.StartInfo.UseShellExecute = true;
printProcess.StartInfo.Verb = "print";
printProcess.Start();
5 Sekunden Googeln ("check if application requires elevation") und 15 Sekunden um zu checken ob der (erste gefundene) Beitrag eh passt:
http://blogs.msdn.com/b/junfeng/archive/2006/10/18/programmatically-determine-if-an-application-requires-elevation-in-windows-vista.aspx
EDIT: 6. Hit bei der selben Suche:
http://stackoverflow.com/questions/2154050/how-to-detect-if-executable-requires-uac-elevation-c-pref
OK, danke, das hilft mir schonmal weiter
Ich hab' auch keinen konkreten Anwendungsfall, mich hat einfach nur interessiert wie das in C# üblicherweise gemacht wird.
Den Tip mit dem Enumerator finde ich gut. Das sollte ein brauchbarer Mittelweg sein, wenn man grosse Files bearbeiten muss, aber nicht unbedingt wild auf Performance optimieren will/muss.
marccore schrieb:
Ich Idiot habe einfach die aktualisierte DLL nicht im Debug Ordner gehabt.
Sondern nur die ältere mit anderen Methoden.
Gegenfrage: Handelt es sich um komplett getrennt entwickelte Projekte?
Ansonsten würde ich diese Projekte in eine Solution packen, dann wird auch bei gesetzter Referenz auch immer die richtige DLL herangezogen (und bei bedarf auch die abhängigen Projekte nochmals neu übersetzt).
hallo
kann mir einer sagen, warum ich das windowsformshost-control nicht sehe, wenn ich das programm starte?
<Window x:Class="SFML_Test.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="693.675" Width="833">
<Canvas HorizontalAlignment="Left" Height="402" Margin="82,243,0,0" VerticalAlignment="Top" Width="674">
<WindowsFormsHost HorizontalAlignment="Left" Height="248" Width="473" x:Name="Host" Background="#FFBB3535" Loaded="Host_Loaded_1"/>
</Canvas>
</Window>
ich wollte das nur mal schnell ausprobieren, um darin eine sfml-anwendung laufen zu lassen, scheitere dabei aber.
das habe ich mal schnell hingeschrieben und eigenartigerweise ist die größe des sfmlwindow immer 0,0. verstehe ich nicht. übersehe ich etwas offensichtliches?
using System.Windows;
using System.Windows.Media;
using SFML.Graphics;
using Color = SFML.Graphics.Color;
using Window = System.Windows.Window;
namespace SFML_Test
{
/// <summary>
/// Interaktionslogik für MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
private RenderWindow sfmlWindow = null;
public MainWindow()
{
InitializeComponent();
}
private void OnRendering(object sender, EventArgs e)
{
RenderLoop();
}
private void RenderLoop()
{
sfmlWindow.Clear(Color.Black);
sfmlWindow.Display();
}
private void Host_Loaded_1(object sender, RoutedEventArgs e)
{
sfmlWindow = new RenderWindow(Host.Handle);
sfmlWindow.SetView(new View(new FloatRect(0, 0, (float)Host.Width, (float)Host.Height)));
CompositionTarget.Rendering += OnRendering;
}
}
}
danke
chrische
Dass es etwas komplizierter ist habe ich mir gedacht, denn aller Wahrscheinlichkeit nach sind hier nicht die ObservableCollections das Problem. So ganz verstanden welche Combobox welchen DataContext hat, habe ich noch nicht, kannst du das auf ein Minimalbeispiel runterbrechen bei dem du den Fehler auch noch hast? Optimalerweise mit Copy & Paste, denn mit Sicherheit wird deine Klasse keine Zeile:
ObservableCollection<Address> UsedAddresses.
haben.
Hi,
kennt jemand eine möglichkeit Controls in den Vordergrund zuholen. Jedoch nicht auf die oberste (wie das bei BringToFront(); passiert) sondern an eine bestimmte Position.
Natürlich könnte ich das lösen in dem ich für mehere Controls die Methode ausführe, ist aber in meinen Prog eher schlecht zu integrieren.
Viele Grüße
da hab ich meine eigene resize funktion reingeschrieben weil es ohne nicht funktioniert.
//private void myForm_resize(object sender, EventArgs e)
//{
// myform.Size = new System.Drawing.Size(Cursor.Position.X - myform.Location.X, Cursor.Position.Y - myform.Location.Y);
// myform.ResumeLayout();
//}
//private void myForm_resize_ResizeBegin(object sender, EventArgs e)
//{
// myform.SuspendLayout();
//}
das funktioniert aber auch nur mäßig. SuspendLayout bringt überhaupt nichts. Ruckelt und zuckelt genauso wie vorher, aber dadurch lässt sich wenigstens die größe ändern.
Ich glaube das einfachste ist ich lass die Form weg und schreib mein eigenes Fenster mit verschieben und größe skallieren in das CustomControl
Hey.
Danke. Wollte ich grade schreiben.
Als ich das Projekt vorhin wieder geladen hab war er da.
Also was lernen wir daraus: Im Zweifelsfall erstmal VS neu Starten/Projekt neu laden.
Aber, falls es euch trotzdem interessiert:
Visual Studio 2010 Professional (Keine Ahnung ob mit irgendwelchen Einschränkungen) und WinForms.
Hast du denn die Referenz auf die Assembly "Microsoft.VisualBasic.dll" bei dir im Projekt eingebunden, s.a. Interaction-Klasse?
Die "using"-Anweisung dient nur dazu, die entsprechenden Klassen nicht mehr mit kompletten Namensbereich (namespace) angeben zu müssen. Damit der Compiler aber diese Namensbereiche und Klassen kennt benötigt er die Referenz (auf deutsch "Verweis") auf die Assembly.
Ich habe mich noch nie mit dem DataGrid-Control beschäftigt, aber das Hinzufügen einer neuen Zeile in der Datentabelle läuft so ab:
var newRow = dataTable.NewRow();
dataTable.Rows.Add(newRow);
newRow[..] = bla bla; //Werte setzen
Beim Speichern bist du mit einem CommandBuilder schon richtig:
using (var cmdBuilder = new MySqlCommandBuilder()) {
cmdBuilder.DataAdapter = dataAdapter;
cmdBuilder.DataAdapter.Update(dataTable);
}