Laden...
Avatar #avatar-2329.gif
xxxprod myCSharp.de - Experte
Programmierer Österreich\Wien Dabei seit 13.04.2006 1.378 Beiträge
Benutzerbeschreibung

Forenbeiträge von xxxprod Ingesamt 1.378 Beiträge

24.03.2011 - 17:44 Uhr

Es gibt leider keine eingebauten Möglichkeiten soweit mir bekannt ist. Mit ReSharper kommt so eine Funktion die dich zu allen abgeleiteten Klassen navigieren lässt.

Lg XXX

24.03.2011 - 17:18 Uhr

Dein Ansatz wird schon stimmen, bzw. zweifle ich nicht daran, dass du das auf die Reihe bringst... dein Problem hat aber zuerst mal nichts mit dem Befüllen deiner Comboboxen zu tun sondern mit dem Laden deiner Daten aus Excel. Offensichtlich kommen aus deiner Abfrage in "DataSet DtSet = filldata.FillingDataSetWithExcelData(MyConnection" keine Daten zurück wodurch dann natürlich in weiter Folge deine Combobox Logik nicht funktionieren kann.

Überprüfe mal warum keine Daten daher kommen bzw. mach dafür einen neuen Thread auf, der das "neue" Problem beschreibt. Wenn du Daten hast kann man dir auch bei deinem Problem weiterhelfen.

Lg XXX

24.03.2011 - 15:23 Uhr

Warum nicht? Und ich meinte nicht das DoubleClickEvent des Grids sondern der Row. aber auch mit dem Grid müsste es funktionieren:

IViewModel viewModel
void GridDoubleClick(...)
{
   viewModel.DoubleClickCommand.Execute(grid.SelectedItem);
}

Lg XXX

24.03.2011 - 15:17 Uhr

Um eine losere Kopplung zu erreichen und aus Gründen der Testbarkeit. Siehe dazu auch T(est)D(riven)D(evelopment).

Lg XXX

24.03.2011 - 14:28 Uhr
list.Where((item, i)=>i != index);

Lg XXX

24.03.2011 - 14:00 Uhr

Ich kenne das Gridobject nicht aber es hat sicher Zeilen, die ein Mousedown evt. sogar ein Mousedoubleclick event haben indem du dann manuell den Command deines ViewModels aufrufen kannst.

Lg XXX

24.03.2011 - 10:43 Uhr

Das ist kein Problem.

Solange beide Views vom selben handeln können sie sich meiner Meinung nach ohne Probleme das selbe ViewModel teilen.

Was anderes ists aber wenn eine view nur zum anzeigen und zum Auflisten von zB Personen ist und eine andere View zum Editieren einer Person verwendet wird. Hier würd ich trennen weil es unterschiedliche Aufgaben sind die dann in einem ViewModel vermischt wären.

Lg XXX

22.03.2011 - 14:28 Uhr

Wenn du die letzte Id in der Tabelle haben willst:


SELECT MAX(t2.ID) FROM Tabelle2 t2 WHERE Tab1_ID=@MA_ID

Wenn du gerade einen Datensatz eingefügt hast und von dem die aktuelle(auto-increment) ID erfahren willst dann bist du bei @@identity schon richtig:


INSERT Tabelle2 (Tab1_ID) VALUES(/*deine ma_id*/)
SELECT @@identity

Lg XXX

22.03.2011 - 10:11 Uhr

Ein Ausschnitt wie ichs verwende:


        public void FillRange(int row, int column, object[,] data)
        {
            dynamic headerRow = _sheet.Range(_sheet.Cells[row + 1, column + 1], _sheet.Cells[data.GetLength(0) + 1, data.GetLength(1)]);
            headerRow.Value = data;
        }

Lg XXX

22.03.2011 - 08:30 Uhr

Hallo!

Bei der Datenmenge sollte man evtl. eher mal über das OpenDocument-SDK (von Microsoft) versuchen, die Daten zu exportieren, weil COM doch recht langsam ist.

Dacht ich bislang auch! (ich wills aber auch nicht abstreiten)

Früher hab ich Excelsheets pro Zelle mit Werten befüllt was extrem langsam war bis ich vor kurzem erst die "Möglichkeit" entdeckt hab einer ganzen Range ein 2-dimensionales Array zuzuweisen was natürlich viel schneller ist.

Lg XXX

19.03.2011 - 22:29 Uhr

Haben die Comboboxen auch ein Databinding? Hängt dieses zufällig bei allen am selben Objekt?

Ansonsten kopier einfach die Liste mit new List<string>(alteListe);

Lg XXX

19.03.2011 - 20:25 Uhr

Wo genau ist dein Problem? Funktioniert was technisch nicht, dann musst du auch genauer erklären was nicht geht bzw. was nicht so geht wie du es dir vorstellst.

Wenns einfach nur um das allgemeine "wie soll ich an die Geschichte rangehen" geht, solltest du einmal kurz ausholen was du erreichen willst(also was soll der User tun dürfen/müssen um was zu erreichen; dabei gehts hier garnicht um die technischen Details).

Lg XXX

19.03.2011 - 16:39 Uhr

Schau dir diesbezüglich vielleicht das folgende Snippet an: Allgemeiner COM-Wrapper für Späte Bindung

Lg XXX

17.03.2011 - 11:10 Uhr

Der richtige ToolTip der Lupe fehlt noch. (Essentiell) 😛

16.03.2011 - 14:15 Uhr

Wow tolles Tool!

16.03.2011 - 10:54 Uhr

Wo lädst du denn die Daten? Verschieb mal das Laden ins Loaded oder so Event falls es sich im Konstruktor befindet.

Der Designer führt pinzipiell den Code aus der InitializeComponent Methode auf. Falls das Binding irgendwie direkt im Designer gesetzt wurde, würde ich dieses auch ins Loaded Event stattdessen verschieben.

Lg XXX

16.03.2011 - 09:08 Uhr

Also wie du das mit den -10 rausgefunden hast bleibt mir ein Rätsel.

Ansonsten mit numA+numB kommt 10 raus(wie Reflector das halt auch anzeigt) und dann wäre das Passwort "noslpkotuppkj" und der geheime Text dann "Dezimalsystem";

Lg XXX

//EDIT: Lol aber mit der originalen Assembly funktionierts natürlich nicht. 😃

09.03.2011 - 08:22 Uhr

Hier ein Beispiel wie ich das für einen TemplateSelector gemacht habe:
(Dabei ist kein DependencyProperty notwendig)


    [ContentProperty("Templates")]
    public class TemplateSelector : DataTemplateSelector
    {
        private readonly List<DataTemplate> _templates = new List<DataTemplate>();

        public List<DataTemplate> Templates
        {
            get { return _templates; }
        }

        public override DataTemplate SelectTemplate(object item, DependencyObject container)
        {
            //....
        }
    }

Lg XXX

08.03.2011 - 09:37 Uhr

Ein System, dass rein aus Addins besteht hat sowieso keinen Bedarf mit den anderen Addins zu kommunizieren, weil es diese ja garnicht kennen kann und die Berechnungen werden sowieso im Adding abgehandelt. Insofern kann ich mir nicht vorstellen wo da so viel Traffic über die App-Domains laufen soll.

Lg XXX

08.03.2011 - 08:59 Uhr

Ich map die EF Objekte auf die Domainobjekte. Ich find die Vorgehensweise recht praktisch, da ich nicht unbedingt das Domainmodel ändern muss nur wenn sich die Datenbank ändert.

Lg XXX

07.03.2011 - 16:16 Uhr

Aber Description ist vom typ ntext. Probier mal die Abfrage ohne die Textspalte auszuführen? Oder zusätzlich einmal die Abfrage nur mit der ID-Spalte im Select um zu sehen obs an der Dauer was ändert.

Lg XXX

07.03.2011 - 16:03 Uhr

Was ist Strange daran?
Wenn ich getdate() als ComputedColumnSpecification eintrage dann schreibt er mir für jede neue Zeile das Datum an die entsprechende Stelle. Genauso wie ich z.B. die ID inkrementieren lassen kann.

Und natürlich möchte ich ihm einen neuen Wert vorgeben, aber die eigentliche Addition möchte ich eben auf der SQL-Seite haben, und nicht im Code des C# Programms.

Du vergleichst Äpfel mit Birnen. Das Autoincrement ist eine Spalteneigenschaft und keine Funktion wie GetDate().

Du kannst als DefaultValue eine eigens definierte Function angeben, die dann deinen neuen Defaultwert berechnet: Working with Default Constraints

Lg XXX

07.03.2011 - 14:28 Uhr

Ist die App und die DB auf dem selben Rechner? Bzw. wie schaut die Verbindung zwischen den App und DB aus? Evt. liegts an einer überlasteten Netzwerkverbindung?

Lg XXX

25.02.2011 - 10:08 Uhr

Ich würd das auch mit einer nested private class oder internal(wenns in einer eigenen Assembly ist) lösen.


    class yWeather
    {
        public yWeather()
        {
            Forecast = new yForecast();
        }

        public IForecast Forecast { get; private set; }

        private class yForecast : IForecast
        {
            
        }
    }

    public interface IForecast
    {

    }

Lg XXX

24.02.2011 - 13:55 Uhr

Verwende kein DataTemplate sondern schreib dir einen IValueConverter.

Lg XXX

24.02.2011 - 13:12 Uhr

Verwendest du SMSS 2005 oder 2008? Beim 2008er gibts IntelliSense als nettes Feature mit dem ich mich einfach durch die existierenden Einträge durchwühle und so bin ich zB auf sys.foreign_keys gestoßen:

select OBJECT_NAME(object_id), OBJECT_NAME(referenced_object_id), OBJECT_NAME(parent_object_id), * from sys.foreign_keys

Lg XXX

24.02.2011 - 11:44 Uhr

sowas vielleicht?

select * from INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE

Lg XXX

24.02.2011 - 10:25 Uhr

Generier eine .bat Datei, die du dann aufrufst. In der Bat-Datei kannst auch die Konsole mit PAUSE offen halten bzw. kontrollieren ob sie überhaupt läuft und falls nicht liegts an deiner Befehlsdefinition. Hat der Pfad zum Beispiel leerzeichen? Normal müsste man den ja auch unter Anführungszeichen setzen aber ich weiß nicht wie das über cmd.exe /c funktioniert.

Lg XXX

24.02.2011 - 10:15 Uhr

Ist mir auch schon aufgefallen, habs aber dann wieder vergessen.

23.02.2011 - 16:58 Uhr

Man kann diese Version ja gewiss noch ausbauen.

Hier eine Variante bei der mehrere Vorkommnisse gecached werden.


        private readonly Regex _regex = new Regex(@"\{[^\}]+\}", RegexOptions.Compiled);
        private string ReplaceTags(string input)
        {
            var replaceCache = new Dictionary<string, string>();
            return _regex.Replace(input, match =>
            {
                string key = match.Value;

                if (!replaceCache.ContainsKey(key))
                    replaceCache.Add(key, SDK_getValue("CurrentMedia." + key));

                return replaceCache[key];
            });
        }

Auch die Abhängigkeit lässt sich natürlich durch ein Dictionary auflösen. Warum aber den Aufwand, wenns unter Umständen nicht gefordert ist.

23.02.2011 - 16:46 Uhr

Meiner Meinung nach total überflüssige Tests.

Du wolltest wissen welche Variante die schnellste ist in Kombination mit den SDK Abfragen und da wette ich ebenfalls auf Regex. Probier mal folgende Variante:


        private readonly Regex _regex = new Regex(@"\{[^\}]+\}", RegexOptions.Compiled);
        private string ReplaceTags(string input)
        {
            return _regex.Replace(input, match => SDK_getValue("CurrentMedia." + match.Value));
        }

du brauchst diesen Aufruf nur einmal für alle deine Tags durchführen(vorausgesetzt alle Tags schauen so aus {....}) und nicht wie bei deinen anderen Varianten mit einer Schleife oder einem haufen If-Statements.

Lg XXX

23.02.2011 - 14:18 Uhr

Ich kann mir das nur so vorstellen, dass du die System.Core.dll mehr als einmal in deinem Projekt referenziert hast(evt. mit unterschiedlichen Versionen(falls dies überhaupt möglich ist)) oder du hast die Methoden irgendwo unter dem selben Namespace wie in System.Core dupliziert.

Lg XXX

//Edit Nachtrag: Dritte Variante: Es gibt mehr als eine Klasse mit dem Namen ICSharpCode.TextEditor.TextEditorControl in deinem Projekt und es kann deswegen nicht die richtige aufgelöst werden

23.02.2011 - 14:13 Uhr

Kanns an den Daten bzw. Images liegen? Probier mal selbes Scenario mit Dummydaten/Dummybildern. Und wär nett wenn du den Fehler auch posten würdest.

Lg XXX

23.02.2011 - 14:06 Uhr

Deiner Beschreibung nach hat dein Problem nichts mit Fremdschlüsseln an sich sondern eher mit mangelnden Grundlagen im Entity-Relationship-Model sowie SQL zu tun.

Zu deinem Problem:

Du hast 2 Möglichkeiten:
1.1 Lösche Auftrag 2
1.2 Füge neuen Auftrag 1 mit neuer (richtiger) Kundennummer ein

2.1 Finde neue Kundennummer von Tabelle Kunde mittels Name
2.2 Aktualisiere Tabelle Auftrag wo AuftragNr=2 und KundenNummer=alterKundenNummer und setze AuftragNr=1

Viel Spaß beim basteln.

Lg XXX

22.02.2011 - 17:33 Uhr

Ich denke das ist was du suchst? TSQL to know database role members

Lg XXX

//EDIT - Auszug:


SELECT
    USER_NAME(memberuid), USER_NAME(groupuid)
FROM
    sys.sysmembers
WHERE
    USER_NAME(groupuid) IN ('db_owner', 'db_accessadmin')

22.02.2011 - 14:27 Uhr

Lösch mal die Resourcen klasse und lass sie von VS neu anlegen.

Ansonsten poste mal bitte einen ScreenShot vom offenen SolutionExplorer der die Datei zeigt und evt. ist sie geöffnet auch noch(doppelclick).

Versuchst du sie im selben Projekt zu verwenden? Standardmäßig sind Resource Dateien internal. Man kann sie auf public umkonfigurieren wenn man sie von externen Assemblies verwendet werden soll.

Lg XXX

22.02.2011 - 13:22 Uhr

Laut dem Bericht soll es möglich sein auch wenn kein Beispiel dabei angeführt ist: The Power of SQL CASE Statements.

Was für einen Fehler bekommst du denn?

Das einzige was ich darüber zu wissen glaube ist, dass man nur auf Spalten der eigenen Tabelle zugreifen kann sowie nur auf die Daten der jeweiligen Zeile.(Hier bin ich mir nicht sicher ob das für Computed Columns oder Check Constraints oder beides gilt). Jedenfalls müssten auch Userdefined Functions funktionieren.

Lg XXX

//Edit: Hier noch etwas dazu gefunden: How to use Computed Columns

PS: Waren die ersten 2 Google treffer mit "tsql computed column case"

22.02.2011 - 12:22 Uhr

Ich kenne Cinch nicht aber ich soweit ich das rausgelesen habe liegt dein Problem in bei der sinnvollen Anwendung der Dependency Injection in Zusammenhang mit dynamisch erzeugten Objekten. Ich hab in meiner App ähnliche Situationen und habe für den Fall meinem Host VM eine Factory injecten lassen welche wiederum den ServiceLocator oder was auch immer injected bekommt. Somit löst du die Zuständigkeit des Objekterstellens wieder aus deinem Host VM heraus ohne den DI-Container direkt in dieses VM injecten zu müssen.

Abstrakt:



public class HostVM
{
    public HostVM(IContentVMFactory contentVmFactory) { }

    void SomeEvent()
    {
        Content = _contentVMFactory.CreateContent(1234);
    }
}

public class ContentVMFactory : IContentVMFactory
{
    public ContentVMFactory(IServiceLocator serviceLocator) { }

    public IContentVM CreateContent(object parameter)
    {
        return _serviceLocator.Resolve<YourType>();
    }
}

Lg XXX

22.02.2011 - 11:59 Uhr

Die Beispieldaten sind mMn. nicht richtig:

Wenn ich aus den ersten 6 Zeilen weiter folge, müsste der CodeName für Zeile sieben nicht 15010000 sonder 15000000 sein und für Zeile 8 nicht 16010000 sondern 16000000.

Wobei ich nicht verstehe was die erste Ziffer bedeutet aber soweit ich das verstehe ist der CodeName der Baum wobei erste und zweite Ebene 0-99 Elemente beinhalten können und die dritte Ebene 0-999.

Ich war so frei dein Beispiel mal in einer kleinen Consolenapp nachzubauen:


        static void Main()
        {
            var strings = new[]
            {
                new[] {"1", "14000000", "Produktgruppe", "1", "1"},
                new[] {"2", "14010000", "Prod.Untergru", "2", "1"},
                new[] {"3", "14010100", "Prod.Unt.Gr.10", "3", "1"},
                new[] {"4", "14010200", "Prod.Unt.Gr.20", "4", "0"},
                new[] {"5", "14010210", "Prod.Unt.Gr.21", "4", "0"},
                new[] {"6", "14010220", "Prod.Unt.Gr.22", "4", "0"},
                new[] {"2", "14020000", "Prod.Untergru", "2", "1"},
                new[] {"3", "14020300", "Prod.Unt.Gr.30", "3", "1"},
                new[] {"4", "14020400", "Prod.Unt.Gr.30", "3", "0"},
                new[] {"7", "15000000", "Produktgruppe", "1", "0"},
                new[] {"8", "16000000", "Produktgruppe", "1", "0"}
            };

            var x = from firstLevel in GroupLines(strings, 1, 2)
                    select new
                    {
                        Item = firstLevel.First(),
                        Children = from seconLevel in GroupLines(firstLevel, 3, 2)
                                   select new
                                   {
                                       Item = seconLevel.First(),
                                       Children = from thirdLevel in GroupLines(seconLevel, 5, 3)
                                                  select new
                                                  {
                                                      Item = thirdLevel.First()
                                                  }
                                   }
                    };

            foreach (var level1Item in x)
            {
                Console.WriteLine(level1Item.Item[1]);
                foreach (var level2Item in level1Item.Children)
                {
                    Console.WriteLine("\t" + level2Item.Item[1]);
                    foreach (var level3Item in level2Item.Children)
                    {
                        Console.WriteLine("\t\t" + level3Item.Item[1]);
                    }
                }
            }
        }

        private static IEnumerable<IGrouping<int, string[]>> GroupLines(IEnumerable<string[]> strings, int startIndex, int length)
        {
            return from line in strings
                   let level = Convert.ToInt32(line[1].Substring(startIndex, length))
                   where level != 0
                   group line by level;
        }

Lg XXX

22.02.2011 - 10:54 Uhr

Dann hab ich dich wohl eingangs falsch verstanden.
Statische Sachen kannst du mit dem x:Static Markup binden.

Lg XXX

//EDIT: Nur gleich zusätzlich zur Info: Man kann nur an Properties binden was bedeutet, dass du deine Liste mittels Property nach außen hin sichtbar machen musst. Die Variable alleine funktioniert nicht.

22.02.2011 - 10:29 Uhr

<StackPanel>
    <StackPanel.Resources>
        <Collections:ArrayList x:Key="abc">
            <System:String>First Item</System:String>
            <System:String>Secon Item</System:String>
        </Collections:ArrayList>
    </StackPanel.Resources>
    
    <ListBox ItemsSource="{StaticResource abc}" />
</StackPanel>

Lg XXX

22.02.2011 - 10:04 Uhr

Sorry aber dein Kommentar im Eingangspost

INotifyPropertyChanged ist es aber nicht.

sagt nichts darüber aus was du schon probiert hast, wie der aktuelle Aufbau deines Programms ist, was nicht funktioniert und was du schon probiert hast. Du könntest dir ruhig ein wenig mehr Zeit nehmen und zumindest versuchen uns genauer zu erklären was dein Problem ist die Leute hier für begriffsstutzig abzustempeln.

Also nochmal; es ist (schon seit meinem Eingangspost) so

Und es wird vermutlich auch so bleiben solange du nicht mit mehr Details rausrückst.

Zeig mal an welchen Stellen im Programm du den DataContext setzt. Was ist das für ein Control auf das du den DataContext setzt, mehr: Was für eine Funktion hat die Gui(ist sie permanent existent oder wird sie nur bei Gelegenheit erzeugt?)

Was mache ich denn falsch, dass dieser Mechanismus nicht funktionieren will ?

Dazu kann man nur was sagen wenn du erzählst was du machst.

Lg XXX

//EDIT: Da hatte mal einer ein ähnliches Problem: INotifyPropertyChanged nicht gesetzt

21.02.2011 - 17:12 Uhr

Hast du schon probiert INotifyPropertyChanged zu implementieren und aufzurufen?
Jau, PropertyChanged wird nicht abboniert !

Ich meine warum willst du ein Changed Event feuern wenn es sich doch offenbar um das selbe Objekt handelt und ein changed insofern fälschlich ausgelöst wird.
Ja, das Objekt bleibt das selbe, dessen Zustand ändert sich aber.

Siehst du - genau was ich meinte. Wenn sich eine Eigenschaft deines Objektes ändert aber nicht das Objekt an sich, dann muss eben dieses Objekt INotifyPropertyChanged implementieren und die entsprechende Änderung bekanntgeben. Im Prinzip das selbe Problem wie hier: List mit INotifyPropertyChanged vs. ObservableCollection. Es ist einfach falsch, das ganze Objekt auszutauschen, nur weil sich sein Inhalt geändert hat.

Lg XXX

21.02.2011 - 15:35 Uhr

Let me Google that for you. 😃

//EDIT: Damits auch hier drinnen steht: ObjectContext.CommandTimeout

21.02.2011 - 15:12 Uhr

ObservableCollection implementiert INotifyCollectionChanged was wiederum von ItemsPresenter verwendet wird um die Items zu aktualisieren wenn sich in der Collection was ändert.

Lg XXX

21.02.2011 - 12:57 Uhr

Hast du schon probiert INotifyPropertyChanged zu implementieren und aufzurufen?

Btw. was willst du denn damit bezwecken? Evt. gibts ja bessere alternativen.

Lg XXX

//EDIT: Ich meine warum willst du ein Changed Event feuern wenn es sich doch offenbar um das selbe Objekt handelt und ein changed insofern fälschlich ausgelöst wird.

21.02.2011 - 12:54 Uhr

Die Prozedur liefert 2 ResultSets retour und mit dem DbDataReader kannst du nur auf das erste zugreifen. Verwende stattdessen einen SqlDataAdapter und fülle ein DataSet und du wirst drinnen voraussichtlich dann 2x DataTables finden, die die Daten der Prozedur abbilden.

Lg XXX

18.02.2011 - 12:48 Uhr

Meine Vermutung: Int ist ein Struct, Structs können nicht vererbt werden insofern können sie nur geboxt werden(in object gecastet) oder wenn sie einen eigenen Cast operator implementieren in einen anderen Typen gecastet werden. Also verbietet der Compiler diesen cast weil er theoretisch nicht möglich ist.

Bei Klassen ist das was anderes. Du kannst von einer Klasse auf eine beliebig andere casten. Sollte der cast schiefgehen, bekommst du halt null als Wert. Bei Structs hingegen kann es keine Nulls geben insofern wäre die Situation bei einem fehlgeschlagenen Cast auch undefiniert.

Hoffe das war halbwegs verständlich 😃

Lg XXX

18.02.2011 - 12:21 Uhr

ungetestet:

return (TResult)(object)result

Lg XXX