Laden...

Forenbeiträge von dirkil Ingesamt 23 Beiträge

04.12.2007 - 19:25 Uhr

@Programmierhans

Das ist im Prizip richtig. Allerdings ist auch dieser Code nicht unter meiner Kontrolle.

Meine Aufgabe ist es, eine entsprechend gefüllte DataTable zu liefern, das dann an ein Syncfusion Grid gebunden wird. Das Grid wird je nach Anwendung auch an andere DataTables gebunden und liegt in einer anderen Assembly und kann nicht geändert werden.

Ich hätte das auch anders entworfen, aber wann ist man als Consultant schon mal auf der grünen Wiese? Wie üblich ist für Refactoring keine Zeit und kein Geld da.

04.12.2007 - 16:04 Uhr

Durch Aufruf einer externen Methode, auf die ich keinen Einfluß habe, bekomme ich ein DataTable Objekt als Ergebnis zurück. Die Nutzer meiner Applikation können die Reihenfolge der Spalten angeben, in der das Ergebnis dargestellt werden soll.

Auf den ersten Blick erscheint es mir, das einfachste zu sein, die Reihenfolge der Spalten im DataTable Objekt zu ändern. Leider muß ich .NET 1.1 verwenden und wie es aussieht, gibt es dort nicht die Methode DataColumn.SetOrdinal, die es in 2.0 gibt.

Hat jemand eine Idee, wie ich die Reihenfolge ändern könnte?

Spontan fallen mir 2 Möglichkeiten ein:
1.) Ein neues (leeres) DataTable Objekt anlegen, die Columns aus dem original kopieren und in der richtigen Reihenfolge einfügen. Danach über die Rows iterieren und entsprechend eintragen. Da ich höchstwahrscheinlich nie viele Rows im Ergebnis habe, dürfte das gangbar sein.

2.) Ein Objekt eigenes DataTableSpecialOrder Objekt von DataTable ableiten und die Zugriffsmethoden auf Rows und Columns überschreiben. Allerdings hätte ich ein wenig Bedenken, daß ich wirklich alle relevanten Stellen erfasse.

Hat irgend jemand eine bessere Idee?

16.04.2007 - 17:45 Uhr

Ich möchte zwei AJAX Control Extender CascadingDropDownLists benutzen. Da meine Logik hinter den DropDownLists sehr einfach ist und ich diese nur auf einer einzigen Seite benötige, möchte ich auf Einsatz eines WebServices verzichten.

Ich möchte zwei einfache PageMethods verwenden, doch leider bekomme ich in den DropDownLists immer [Method error 500] angezeigt anstatt der eigentlichen Einträge.

Meine Methode sieht so aus:

    [System.Web.Services.WebMethod]
    [System.Web.Script.Services.ScriptMethod]
    public CascadingDropDownNameValue[] GetRundenArtDDLValues(
       string knownCategoryValues, string category) 
    {
        
        List<CascadingDropDownNameValue> list = new List<CascadingDropDownNameValue>();
        list.Add(new CascadingDropDownNameValue("aaa", "1"));
        list.Add(new CascadingDropDownNameValue("bbb", "2"));
        list.Add(new CascadingDropDownNameValue("ccc", "3"));
        return list.ToArray();
        
    }

Mein CascadingDropDown sieht so aus:

<cc4:CascadingDropDown ID="CascadingDropDown2" runat="server" Category="RundenArt"
                PromptText="Wählen Sie die Art der Runde" ServiceMethod="GetRundenArtDDLValues"
                TargetControlID="rundenArtCB">
            </cc4:CascadingDropDown>

Was mache ich falsch?

26.03.2007 - 13:58 Uhr

Ich habe eine Seite, auf der ich von allen News die ersten 300 Zeichen anzeige. Jede solche News hat einen "Mehr..." Link, der auf eine Detailsseite verzweigt, auf der die komplette News angezeigt wird.

Diese komplette News möchte ich als FormView mit aktiviertem Paging implementieren, so daß der Nutzer nach dem Lesen der News direkt zur nächsten springen kann, ohne erst wieder zurück auf die Übersichtsseite zu müssen.

Als DataSource habe ich ich ein query der Form "SELECT * FROM news" verwendet. Wie bringe ich es jetzt dem FormView bei, auf die Seite zu wechseln, die der gewählten NewsId entspricht?

28.02.2007 - 18:14 Uhr

Konnte das Problem selbst lösen. Die Klasse PerformanceTableRow ist eine inner class von Performance.

Die Lösung lautet also:

Performance.PerformanceTableRow row = PerformanceTable.NewPerformanceTableRow();
28.02.2007 - 17:29 Uhr

Ich habe ein Typed Dataset mit Namen PerformanceTable und möchte dieses nun im Code befüllen.

Ich habe gelesen, daß ich das mit

PerformanceTableRow row = PerformanceTable.NewPerformanceTableRow();

mache und dann nur noch mit row arbeite.

Das ist auch soweit in Ordnung, nur das Problem ist, daß der Compiler den Typ **PerformanceTableRow **nicht kennt. Ich bekomme IntelliSenseSupport für NewPerformanceTableRow() und der ToolTip sagt auch, daß der Rückgabewert vom Typ **PerformanceTableRow **ist, aber es kompiliert nicht.

Ich kann die Definition von **PerformanceTableRow **auch in dem generierten .cs File sehen, aber wie referenziere ich das in einem anderen .cs File?

Ich habe schon versucht, einen namespace um alles in dem generierten File zu machen und eine entsprechende using Anweisung in der Datei, in der in mein Dataset befüllen möchte. Aber ohne Erfolg.

Es ist wahrscheinlich super trivial, aber ich sehe es einfach nicht. Wie referenziere ich eine Klasse (ohne Namespace) in einem anderen .cs File, das vielleicht auch in einem anderen Ordner liegt?

Vielen Dank im Voraus!

28.02.2007 - 17:21 Uhr

@Jürgen

Vielen Dank für Deine Antwort. Genau das war das Problem. Jetzt klappts.

27.02.2007 - 17:35 Uhr

Ich habe mir ein .xsd ins Projekt geholt und eine DataTable mit ein paar Feldern angelegt. Anschließend mit

xsd.exe" /d /l:C# TestDS.xsd

ein entsprechendes .cs File erzeugt. Jetzt wollte ich mein Projekt kompilieren, doch ich bekam folgdene Fehlermeldungen:

Error 19 Der Typ TestDS enthält bereits eine Definition für DataTable1RowChangeEventHandler. c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\website20\05d9e169\af6971af\App_Code.luo9_nbb.1.cs 219

Error 20 Der Typ TestDS enthält bereits eine Definition für DataTable1RowChangeEvent. c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\website20\05d9e169\af6971af\App_Code.luo9_nbb.1.cs 567

Ich habe das mit verschiedenen XSD-Dateien probiert, aber ich bekam immer diese Meldungen.

Was mache ich falsch?

02.02.2007 - 22:23 Uhr

@Norman

Da sieht mn mal, daß ich völlig überarbeitet bin. Jetzt schreibe ich schon in Englisch in diesem Forum...

Ok, alles klar, ich wollte nur sichergehen, daß ich nichts übersehe. Vielen Dank für die Antworten.

02.02.2007 - 17:58 Uhr

@herbivore

Hm, I am not sure if I understood how to use it. I didn't mention that the control is in a window of another process. I use EnumChildWindows to iterate over the controls.

My Callback is like that:

public bool WindowEnumProc(IntPtr hwnd, int lParam)
        {
            
            // get the text from the window
            StringBuilder bld = new StringBuilder(256);
            GetWindowText(hwnd, bld, 256);
            string text = bld.ToString();

            if (text == "Btn")
            {
                RECT rect = new RECT();
                GetWindowRect(hwnd, out rect);
                 
                Console.WriteLine(string.Format("Left={0}, Top={1}, width={2}, height={3}", rect.Left, rect.Top, rect.Right-rect.Left, rect.Bottom-rect.Top));
                
            }
            return true;
        }

I think I can't use Control.PointToClient() because I only have an handle to the window. Or am I overlooking something?

02.02.2007 - 17:33 Uhr

Ich habe mit GetWindowRect des Rechteck eines Buttons in einem Fenster ermittelt. Dieses hat allerdings Screen Koordinaten. Ich würde aber lieber die relativen Koordinaten des Buttons innerhalb des Fensters haben, in dem es sich befindet.

Gibt es dafür eine Routine oder muß ich auch noch das Rect des Parents ermitteln und dann die Differenzen bilden?

31.01.2007 - 22:53 Uhr

Ich würde gerne ein Programm in C# schreiben, mit dem man eine Liste von Controls (incl. deren Properties wie Width, Height, Left, Top, etc.) erstellen kann, die sich in einem Fenster einer anderen Applikation befinden.

Im Grunde geht es um eine Funktionalität wie sie das Spy++ Tool von Visual Studio zur Verfügung stellt. Ich habe schon eine Routine entwickelt, mit der ich das Window Handle des entsprechenden Fensters ermitteln kann.

Wie mache ich von da weiter, um die enthaltenen Controls zu bekommen?

26.12.2006 - 01:13 Uhr

Habe das Problem lösen können.

Man muß den Client Channel mit port="0" registrieren, um Callbacks zu erhalten. Auf diese Weise sucht das .NET Framework einen beliebigen freien Port für die Clientseite und überträgt diesen auch zum Server, damit dieser auch antworten kann.

24.12.2006 - 02:28 Uhr

Ich habe es jetzt mit Konfigurationsfiles versucht. Das ist super, da der Code sehr viel kürzer wird. Aber die Fehlermeldung ist nachwievor die gleiche:

Der Remoteproxy hat keinen Channelempfänger, d.h. der Server besitzt keine registrierten Serverchannel oder die Anwendung hat keinen passenden Clientchannel, um mit dem Server zu kommunizieren.

Ich kann also Standard Datentypen übertragen, aber keine Bitmap.

Im übrigen brauche ich in meinem Fall die Zeile

RemotingServices.Marshal((MRB),"MyRemoteObject");

nicht, da dies nur für Published Objects gilt, also solche, die vom Server vorab erzeugt werden.

Wer hat noch eine Idee, was ich mal versuchen könnte?

20.12.2006 - 00:38 Uhr

@Rainbird

Vielen Dank für Deine Antwort. Das hört sich sehr vernünftig an. Nur wenn ich gewisse Parameter in einer config Datei speichere, wie sieht dann der übriggebliebene Code aus?

Ganz konkret: ich will letztendlich CallSlave aufrufen. Dies ist im cTransfer Objekt. Also muß ich mir zunächst das cTransferObjekt beschaffen. Ich habe das bislang so gemacht:


String url = String.Format("tcp://{0}:{1}/TestService", serverTB.Text, portTB.Text);
transfer = (Remote.cTransfer)Activator.GetObject(typeof(Remote.cTransfer), url);

Anschließend die Methode aufgerufen:


Remote.NiftyResponse response = transfer.CallSlave(screenshot);

Wie läuft das jetzt mit einem Config File?

19.12.2006 - 12:52 Uhr

Es hat warhrscheinlich etwas damit zu tun, daß ich jetzt auf Serverseite einen BinaryServerFormatterSinkProvider verwende. Ich habe gesehen, daß es ein dazu passenden BinaryClientFormatterSinkProvider gibt.

Doch wie verwende ich diesen?

Ich habe folgenden Code:

[Serializable]
    public class Screenshot
    {
        private Bitmap _screenshot;
        public Bitmap Screenshot
        {
            get { return _screenshot; }
            set { _screenshot = value; }
        }

        private int _shotType;
        public int ShotType
        {
            get { return _shotType; }
            set { _shotType = value; }
        }

    }

    [Serializable]
    public class Response
    {
        private String _result;
        public String Result
        {
            get { return _result; }
            set { _result = value; }
        }
    }

    public class cTransfer : MarshalByRefObject
    {
        public delegate Response del_SlaveCall(Screenshot screenshot);
        public event del_SlaveCall ev_SlaveCall;

        // Default public no argument constructor
        public cTransfer()
        {
        }

        public NiftyResponse CallSlave(NiftyScreenshot screenshot)
        {
            return ev_SlaveCall(screenshot);
        }

        public override Object InitializeLifetimeService()
        {
            return null;
        }
    }

Mein Client-seitiger Aufruf sieht so aus:


private void Notify(Bitmap bm, int shotType)
        {
            Remote.Screenshot screenshot = new Remote.Screenshot();
            screenshot.Screenshot = bm;
            screenshot.ShotType = shotType;          

            String url = String.Format("tcp://{0}:{1}/TestService", serverTB.Text, portTB.Text);
            try
            {
                transfer = (Remote.cTransfer)Activator.GetObject(typeof(Remote.cTransfer), url);

                // Löst den Event transfer.ev_SlaveCall im Server aus
                Remote.Response response = transfer.CallSlave(screenshot);               
            }
            catch (Exception Ex)
            {
                MessageBox.Show(this, "Fehler:\n" + Ex.Message, "Master Error");
            }
            

        }

Beim Aufruf von transfer.CallSlave(...) kommt die Exception.

An welcher Stelle müßte ich den BinaryClientFormatterSinkProvider einbauen? Oder ist es doch ein anderes Problem?

19.12.2006 - 12:32 Uhr

Ich wollte auch eine Bitmap übertragen und hatte das gleiche Problem wie naumann.

Daher war ich froh, daß Daedalus eine Lösung gefunden hat. Dieses Problem ist bei mir jetzt weg, dafür gibt es ein neues: ich bekomme jetzt beim Übertragen eine Exception mit der Meldung:

"Der Remoteproxy hat keinen Channelempfänger, d.h. der Server besitzt keine registrierten Serverchannel oder die Anwendung hat keinen passenden Clientchannel, um mit dem Server zu kommunizieren."

Ich bin leider noch Anfänger auf dem Gebiet Remoting, daher kann es auch sein, daß ich etwas sehr Triviales vergessen habe einzustellen.

Wenn ich in meinem zu übertragenen Objekt die Bitmap auskommentiere und sonst alles so lasse, dann funktioniert die Übertragung einwandfrei. Nur mit Bitmap bekomme ich die Probleme.

Wäre schön, wenn jemand einen Rat hierzu hätte.

07.12.2006 - 13:41 Uhr

Ich tippe eher darauf, daß eine Wurzel von einem negativen Wert gezogen werden soll.

Vielleicht postest Du mal, welche Werte Du für a, b und c eingibst, um den Fehler zu bekommen.

03.12.2006 - 00:16 Uhr

@herbivore

Wow, das war schnell! Vielen Dank für Deine Antwort!

03.12.2006 - 00:00 Uhr

In C# hat man ja allerlei Möglichkeiten, Zahlen zu formatieren. Für meine Anwendung benötige ich bei positiven Zahlen ein führendes '+' und bei negativen wie gewöhnlich ein '-'.

Wenn ich in meinem Format String ein '+' voranstelle, dann kommt als Ergebnis immer ein +, also auch bei negativen Zahlen. Eine -7 würde dann als +-7 dargestellt.

Ich habe auch schon allerlei Dokumentation durchwühlt, aber nichts gefunden. Wer hat eine Idee für mich?

04.11.2006 - 23:48 Uhr

Ich entwickle gerade ein Custom Control für ASP.NET in C#. In Visual Studio habe ich dafür eine Solution erstellt, in der eine ASP Web Site enthalten ist und ein C# Custom Control Projekt.

In meiner Web Site verwende ich schon einige Hilfsklassen für die Business Logik. Diese benötige ich nun auch für mein Control im C# Projekt. Wie kann ich in meinem C# Objekt die Klassen in meiner Website referenzieren?

Umgekehrt ist es mir klar: ich füge einfach eine Reference auf meine DLL in meiner Web Site hinzu. Gibt es sowas auch für C# Custom Control Projects?

Ich habe nämlich keine Lust, nur wegen eines Controls alle meine Klasen aus der Web Site in mein Control Project zu packen, wenn es eine andere Möglichkeit gibt.

Wer weiß Genaueres?

13.09.2006 - 17:10 Uhr

Wow! Das nenne ich schnell. Vielen Dank für die prompte Hilfe!

13.09.2006 - 16:50 Uhr

Ich probiere schon eine ganze Weile rum, mehrere Arrays per Property auszulesen. Geht das nur mit einem Array und mittels this?

Beispiel:


public class MyClass
{
  public MyClass()
  {}

  private string _name:
  public string Name
  {
    get { return _name; }
    set { _name = value; }
  }

  private int[] _x = new int[10];
  private int[] _y = new int[10];


Wie kann ich Properties X und Y haben, so daß ich beispielsweise so zugreifen könnte?


MyClass m = new MyClass();
System.Console.WriteLine( Convert.ToString(m.X[2]) );

Ist sowas möglich? Wenn ja, wie lautet die genaue Syntax?