Laden...

Forenbeiträge von realProg Ingesamt 95 Beiträge

03.07.2013 - 09:08 Uhr

Hallo!

Folgendes Problem:
Ich starte einen Process der ein Excelfile drucken soll. Das klappt soweit auch ganz gut. Probleme gibt es nur dann, wenn die Datei korrupt ist. D.h. die Methode .Start() blockiert und alle weiteren Druckaufträge können nicht ausgeführt werden.

Ich hätte auch versucht das Starten in einem eigenen Thread durchzuführen und diesen nach einer gewissen Zeitspanne zu beenden, aber das Beendet mir den Prozess auch nicht.

Funktionieren tut es, wenn ich mir den konkreten Process mittels Name ("EXCEL") hole und .Kill() darauf ausführe, was aber nicht zielführend ist, da beliebige Dokumente gedruckt werden sollen.

Wie kann ich im Fall einer Fehlermeldung vor Anzeige des Exceldokuments den Prozess beenden?

Derzeitger Code:


string tempFile = @"C:\temp\test.xls";
printJob.StartInfo.FileName = tempFile;
printJob.StartInfo.Verb = "PrintTo";
printJob.StartInfo.CreateNoWindow = true;
printJob.StartInfo.ErrorDialog = false;
printJob.StartInfo.Arguments = String.Format("\"{0}\"", "Printername");
printJob.StartInfo.WorkingDirectory = Path.GetDirectoryName(tempFile);
printJob.Start();

if (!printJob.WaitForExit(10000))
{
    printJob.Kill();
}


26.03.2013 - 11:37 Uhr

verwendetes Datenbanksystem: MSSQL Server 2008

Hallo Leute!

Ich synchronisiere Daten zwischen MSSQL-Server und einem iOS-Client.
Das funktioniert alles soweit einwandfrei bis auf die Löschfunktion am Client.

Wenn ich einen Eintrag am iOS-Client entferne retouniert mir der Server immer folgende Fehlermeldung:


<ServiceError xmlns="http://schemas.datacontract.org/2004/07/Microsoft.Synchronization.Services" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><ErrorDescription>Microsoft.Synchronization.Services.SyncServiceException&#xD;
The Id property of the entity is not in the correct format. EntityId: 'server/FileServerData.TaskByReceivers(Id=guid'7d17da9d-e59d-401d-9af0-4a0438e4cca2')'&#xD;
   bei Microsoft.Synchronization.Services.WebUtil.ParseIdStringAndPopulateKeyFields(IOfflineEntity entity, Uri serviceBaseUri)&#xD;
   bei Microsoft.Synchronization.Services.RequestParser.ReadIncomingRequestStreamForPost()&#xD;
   bei Microsoft.Synchronization.Services.RequestParser.ReadIncomingRequestDetails()&#xD;
   bei Microsoft.Synchronization.Services.RequestParser.ParseIncomingRequest()&#xD;
   bei Microsoft.Synchronization.Services.SyncService`1.ProcessRequestForMessage(Stream messageBody)&#xD;
&#xD;
&#xD;
</ErrorDescription></ServiceError>
2013-03-26 11:17:14.216 Program[1486:5f03] Failed to upload changes Error Domain=org.brautaset.JSON.ErrorDomain Code=3 "Unrecognised leading character" UserInfo=0xa023da0 {NSLocalizedDescription=Unrecognised leading character} {
    NSLocalizedDescription = "Unrecognised leading character";
}

Aufruf (JSON):


{
  "d" : {
    "__sync" : {
      "moreChangesAvailable" : false,
      "serverBlob" : "serverblob data"
    },
    "results" : [
      {
        "__metadata" : {
          "isDeleted" : true,
          "type" : "removed.Entities.TaskByReceiver",
          "uri" : "server/FileServerData.TaskByReceivers(Id=guid'7d17da9d-e59d-401d-9af0-4a0438e4cca2')"
        }
      }
    ]
  }
}

Ich weiß aber nicht mehr, was ich noch versuchen könnte um das auf die Reihe zu bekommen. Der Primärschlüssel ist Id vom Typ Guid
Der Aufruf müsste meiner Meinung nach so passen. Muss ich hier serverseitg noch etwas beachten?

Danke im Voraus.

27.02.2013 - 10:46 Uhr

Ach shit, nachgedacht hab ich, aber verkehrt 😕
Danke für die Antworten, dass wars.

27.02.2013 - 09:29 Uhr

Ablauf:

Webservice wird aufgerufen und startet Konsolenprogramm welches auf dem Server liegt (nicht SharePoint-Server).
Dieses Konsolenprogramm ließt dann die Struktur des SharePoints aus.

Das Konsolenprogramm wird mit dem Benutzer "SYSTEM" gestartet. In der Config des Konsolenprogramms sind die SharePoint-Zugangsdaten hinterlegt mit welchem sich das Programm am SharePoint anmelden soll.

WorkingDirectory ist gesetzt und die AppPool-Identity ist auf "Local Sytem" gesetzt.

Fazit: Das Programm wird gestartet, die Anmeldung am SharePoint funktioniert dann aber nicht mehr (was bei Start des Programms direkt am Server aber funktioniert).

27.02.2013 - 09:14 Uhr

Ich glaube nicht, dass es hier an der SharePoint-Version etc. liegt.
Wenn ich das Programm direkt starte läuft alles problemlos.

Ich glaube viel mehr, dass das Problem im Benutzer des Prozesses liegt, da dieser bei lokaler Ausführung ein anderer ist (angemeldeter Benutzer), als bei Start über das Webservice (SYSTEM).

27.02.2013 - 08:39 Uhr

Hallo Leute!

Ein Prozess (Konsolenprogramm welches ca. eine halbe Stunde läuft) soll durch Aufruf eines Webservices (.asmx) gestartet werden.
Was ist hierfür die beste Strategie?

Der Prozess kann auch gestartet werden, nur kommt es durch fehlende Berechtigungen zu Problemen bei der Abarbeitung des Prozesses. D.h. ich kann nicht auf SharePoint zugreifen

18.12.2012 - 08:11 Uhr

Hallo!

Ich starte für jeden Druckauftrag einen Prozess, der das jeweilige Programm öffnet (z.B. MS Office) und die Datei druckt.
Das funktioniert bereits ohne Probleme und ohne Dialoge.

Gibt es eine Möglichkeit Fehlerdialoge der Programme (z.B. MS Office -> "Konnte Dokument nicht öffnen") zu ignorieren?
Sonst blockiert das Programm meine Druckaufträge für den jeweiligen Dateityp, bzw. welche gängigen Lösungsansätze gibt es da?
Diese Problemstellung wird ja sehr oft vorkommen, habe allerdings wenig aussagekräftige Information gefunden.

Danke im Voraus.

LG

23.10.2012 - 13:49 Uhr

Hallo!

Kurz und bündig: ich will aus einem **Webservice **heraus einen Drucker im Netzwerk ansprechen, welcher Dokumente **jeglicher **Art drucken soll.

Welche guten Möglichkeiten / ev. APIs kennt ihr für so etwas?
Bzw. ist es überhaupt ohne weiteres möglich? Sehe ein Problem wenn ich Dokumente verschiedenster Art drucken möchte.

Danke im Voraus.

09.08.2012 - 09:23 Uhr

Hallo,

ich habe einen Downloadhandler mit dem Dateien von mobilen Clients abgerufen werden können.

Hier muss ich bemerken, dass es bei Dateien (ab ~4MB) immer wieder zu folgender Fehlermeldung, obwohl es teilweise auch funktioniert, kommt (im Log-File).:

Fehlermeldung:
2012-08-08 16:17:54,409 ERROR ApplicationLogger [(null)] - Application - FileUrl=..... bei System.Web.Hosting.IIS7WorkerRequest.RaiseCommunicationError(Int32 result, Boolean throwOnDisconnect)
bei System.Web.Hosting.IIS7WorkerRequest.ExplicitFlush()
bei System.Web.HttpResponse.Flush(Boolean finalFlush)
bei System.Web.HttpResponse.Flush()
bei .....GeneralDownloadHandler.ProcessRequest(HttpContext context)
2012-08-08 16:17:54,409 ERROR ApplicationLogger [(null)] - Application - Der Remotehost hat die Verbindung beendet. Fehlercode: 0x800703E3.
bei System.Web.Hosting.IIS7WorkerRequest.RaiseCommunicationError(Int32 result, Boolean throwOnDisconnect)
bei System.Web.Hosting.IIS7WorkerRequest.ExplicitFlush()
bei System.Web.HttpResponse.Flush(Boolean finalFlush)
bei System.Web.HttpResponse.Flush()
bei ....GeneralDownloadHandler.ProcessRequest(HttpContext context)

Liegt es am Code des Handlers, oder an der Verbindung?
Wo liegen die Probleme am Code?
Gibt es Alternativen die ich berücksichtigen kann?

Hier der Code des Handlers etwas gekürzt:


public void ProcessRequest(HttpContext context)
        {
            HttpResponse response = context.Response;
            HttpRequest request = context.Request;
            string fileUrl = request.Params["fileUrl"];

            if (String.IsNullOrEmpty(fileUrl))
            {
                LogHelper.Warning("FileUrl is null or empty");
                response.StatusCode = 400;
                PrintError(response);
                return;
            }

            try
            {
                // set content-header
                response.ContentType = Util.GetMIMEType(fileUrl);
                response.Clear();
                SharePointMethods spMethods;

                try
                {
                    spMethods = new SharePointMethods(ConfigurationHelper.SharepointUrl,
                        ConfigurationHelper.SharepointUser, ConfigurationHelper.SharepointPassword,
                        ConfigurationHelper.SharepointDomain);
                }
                catch (Exception ex)
                {
                    UpStateChecker.CouldNotAccessSharePoint();
                    throw ex;
                }
                UpStateChecker.CouldAccessSharePoint();

                string newFileUrl = fileUrl;
                string entrypoint = ConfigurationHelper.SharepointCustomerEntryPoint;
                string tFilename = fileUrl;

                // Get file from Sharepoint
                using (Stream ms = spMethods.GetFileForRelativeServerPath(
                    String.Format("/{0}/{1}", entrypoint, newFileUrl)))
                {
                    //set tFilenname...

                    response.AddHeader("Content-Disposition", "filename=" + tFilename);
                    response.BinaryWrite(Util.GetStreamBytes(ms));
                    response.Flush();
                }
            }
            catch (Exception ex)
            {
                LogHelper.Error(ex.GetFullErrorMessage());
                response.StatusCode = 404;
                PrintError(response);
            }
            HttpContext.Current.ApplicationInstance.CompleteRequest();
        }

25.07.2012 - 11:45 Uhr

Ich möchte noch hinzufügen, dass die Fehlermeldung nur eintritt, wenn ich mit einem Thread arbeite.
Ohne Threading tritt kein Problem auf!

Was kann hierfür die Ursache sein?

17.07.2012 - 16:05 Uhr

Ja danke, damit kann ich leben 😃
aber das exePath Problem ist mir ein Rätsel

Ja die externe Bibliothek holt sich den ConnectionString selbst aus der Config... ich übergebe nur den key des Eintrages...

17.07.2012 - 15:54 Uhr

D.h. dass der Thread den ich selber bei ApplicationStart gestartet habe schlafen gelegt wird und bei jedem Request (wenn die Applikation schläft) dieser Thread wieder erneut gestartet wird?

17.07.2012 - 15:41 Uhr

Okay danke dir!

Ich dachte, dass gestartete Threads in der global.asax (Application_Start) über die gesamte Lebensdauer laufen, bzw. am Leben gehalten werden?

Oder wie erreiche ich sonst ohne spezielle Konfiguration von IIS eine dauerhafte Abarbeitung?

17.07.2012 - 15:26 Uhr

okay, danke.

D.h. Es dürfte also kein Problem sein wenn in der Global.asax ein Thread gestartet wird, der für die Abarbeitung einer Queue zuständig ist und Daten (unter Zuhilfenahme der externen Bibliothek) in eine DB speichert, wobei die DB Connection in der web.config angegeben ist.

Ich glaube nämlich, dass die externe Bibliothek das config-file nicht findet und deswegen irgendwie der exePath gesetzt werden soll. Sicher bin ich mir aber auch nicht.

17.07.2012 - 15:12 Uhr

Naja, ganz so spezifisch ist die Fehlermeldung dann auch nicht (auch hier wird davon gesprochen):

http://stackoverflow.com/questions/235618/wcf-and-system-configuration-namespace

Wenn eine extene Bibliothek auf die config zugreifen will, wird in erster Priorität immer die web.config verwendet, verstehe ich das richtig?

Die Zugriffe auf die DB sind in einem eigenen Thread. Könnte das Probleme machen?

17.07.2012 - 11:06 Uhr

Hallo Community!

Ich habe eine ASP.NET - Webanwendung, in der auf eine Klassenbibliothek zum Datenbankzugriff referenziert wird.
Der Datenbank-ConnectionString ist in der .config der Webanwendung angeführt.

Wenn ich nun die Webanwendung starte, wird folgende Exception geworfen (in der Zeile der Klassenbibliothek, wo auf den ConnectionString zugegriffen wird):

exePath muss angegeben werden, wenn er nicht innerhalb einer eigenständigen EXE-Datei ausgeführt wird.

Warum tritt hier das Problem auf und wie kann es behoben werden?

Danke im Voraus.

12.06.2012 - 10:59 Uhr

Okay,

d.h. zusammengefasst:
Ich erstell mir eine Klasse, die Aufträge entgegennimmt und diese in die SyncQueue steckt.
In der Global.asax starte ich einen Thread, der in einer Endlosschleife Elemente aus der SyncQueue abruft und jedes einzelne Element abarbeitet, wobei ich bei dieser Abarbeitung Zugriffe auf meine nicht threadsicheren Klassen wiederum locken muss.

Stimmt das so?

12.06.2012 - 10:27 Uhr

Danke für die Antwort!

Wo starte ich diesen Thread im optimalen Fall, damit es nicht dazu kommt, dass dieser beendet wird, bzw. gestalte ich diese autarke Queue?

Gibt es Erfahrungen bezüglich dem von dir erwähnten Punkt: Webanwendungen nach einer gewissen IdleTime schlafen legen?

Danke.

12.06.2012 - 10:05 Uhr

Ja gut, über die Möglichkeiten bin ich mir schon bewusst. Es geht mir viel mehr um das dahinterliegende Konzept, eben aus der Tatsache heraus, dass es sich um ein Webservice handelt.

D.h. der Behälter dahinter ist unrelevant, viel mehr geht es um das wie gestalte ich so eine Jobqueue in einem Webservice...

12.06.2012 - 09:45 Uhr

Hallo,

ich stehe vor der Aufgabe, Excelvorlagen mit Werten zu befüllen und diese anschließend wieder abzuspeichern. Alles kein Problem soweit.

Das Ganze wird von einem Webservice gesteuert, da die Daten an dieses gesendet werden und so der Aufruf für die Befüllung gegeben wird.

Nun möchte ich jedoch aus Sicherheitsgründen eine Art Warteschlange einbauen, in der nicht erfolgreich erstellte Dokumente abgelegt werden und in einem bestimmten Zeitintervall die Erstellung wiederholt wird.

Meine Frage: Wie erstelle ich eine Warteschleife in Webservices, die jede Minute überprüft ob noch Jobs abgearbeitet werden müssen und wenn ja, diese abgearbeitet werden?

Danke im Voraus und LG

29.05.2012 - 18:36 Uhr

Hallo,

gibt es eine Möglichkeit eine Liste mittels URL auszulesen? (Microsoft.Sharepoint.Client)

die Methode GetByTitle reicht mir nicht aus, da der Titel unterschiedlich zur Url sein kann.

Danke im Voraus

14.05.2012 - 14:29 Uhr

Hallo,

mittels Microsoft.Sharepoint.Client Bibliothek möchte ich die Dateistruktur einer Liste auslesen. Kann mir wer sagen, wo ich hier Zeit verliere?
Das Ausführen der Methode benötigt teilweise sehr lange.

Danke im Voraus!



public IList<Microsoft.SharePoint.Client.File> GetFileStructureOfList(string listName, bool includeSubfolder)
        {
            IList<Microsoft.SharePoint.Client.File> files = new List<Microsoft.SharePoint.Client.File>();
            try
            {
                string scope = string.Empty;
                if (includeSubfolder)
                {
                    scope = "Scope='Recursive'";
                }

                List list = this.web.Lists.GetByTitle(listName);
                
                CamlQuery query = new CamlQuery();
                query.ViewXml = string.Format(@"<View {0}>
                                </View>", scope);
                ListItemCollection listItems = list.GetItems(query);
                this.clientContext.Load(listItems, li => li.Include(pi => pi.File));
                this.clientContext.ExecuteQuery();
                foreach (var item in listItems)
                {
                    files.Add(item.File);                    
                }
            }
            catch (Exception)
            {
                throw new Exception("Failed to get file structure of list");
            }
            return files;
        }

18.12.2011 - 20:44 Uhr

Hallo,

nachdem die Collection verschiedene Objekte beinhaltet, wollte ich das ganze ausschließlich in XAML machen um nicht wieder im VM eine generelle Property zu machen wo ich dann, abhängig vom ausgewählten Element, die dementsprechende Collection zurückliefere, da die Items in der ListView Checkboxen sind und ich im VM trotzdem alle Collections mit ihren Checkzuständen benötige.

Ich habe es aber soeben mit einem DataTrigger geschafft.

Danke trotzdem!

18.12.2011 - 19:53 Uhr

Hallo,

ich stehe vor folgendem Problem:
Ich habe eine Combobox und eine ListView.

Ändert sich der Wert der Comboxbox sollen die Items in der ListView dementsprechend andere sein.
Ich benütze das MVVM Pattern und möchte deshalb auf Code-Behind verzichten.

Gibt es hier eine Möglichkeit die ItemsSource-Bindung der ListView je nach ausgewähltem Wert in der Combobox anzupassen?

Danke im Voraus!

20.07.2011 - 00:53 Uhr

verwendetes Datenbanksystem: MSSQL Express 2008

Hallo,

ich arbeite mit Datasets und möchte in der Datenbank Gleitkommawerte die in einer Textbox eingegeben werden abspeichern.
Irgendwo wird dieser Wert aber in einen Integerwert umgewandelt und als Integer in die Datenbank abgelegt.
Der Datentyp der betreffenden Spalte ist float (in der Datenbank).

Das komische ist, dass es bei anderen Feldern funktioniert, wobei alles gleich programmiert und konfiguriert ist.
Auch beim debuggen wird bis zum Aufruf des Speicherns (mit Tableadapter) der richtige Wert angezeigt. Danach kommt es allerdings irgendwo zu einer indirekten Umwandlung

Hat von euch jemand eine Idee?

22.06.2011 - 14:04 Uhr

Hallo Community,

seit einigen Monaten weiß ich schon nicht mehr was ich machen soll um folgenden Fehler zu verhindern.

Ich habe eine MainForm, in welcher ich eine zweite Form aufrufen will

SecondForm sf = new SecondForm(par1, par2);
DialogResult dr = sf.ShowDialog();

In dieser SecondForm ist ein Control eingebunden, welches Kartenmaterial anzeigt (GMap).

Wird eine Karte angezeigt und ich schließe diese SecondForm wird sie mir nicht mehr angezeigt, die Hauptform friert allerdings noch rund 8 Sekunden ein.

Wenn ich debugge, wird das closing ganz normal durchgesteppt und verlassen. Nach diesem Verlassen hängt es 8 Sekunden und ich bekomme danach den eine Fehlermeldung wie unten im Bild ersichtlich.
Ich habe diesen Fehler nur bei Forms die dieses Control beinhaltet und ich weiß nicht woran es liegt.

Was kann hier ein Fehler sein?
(ich hab auch versucht das ganze in einem using Block zu machen -> gleiches Ergebnis)

26.04.2011 - 23:17 Uhr

ja, also ich mess die zeit jeweils und es ist so, dass genau hier die Zeit verloren geht.

auf der einen Seite das select statement direkt im code


          SqlConnection conn = new SqlConnection(connStr);
          SqlDataAdapter da = new SqlDataAdapter(selectStm, conn);
          //zeitmessung beginn
          da.Fill(ds);
          //zeitmessung ende

auf der anderen mittels tableadapter


      get {
        //zeitmessung beginn
        tAPhase.FillBy(this.dsData.Phase);
        //zeitmessung ende
        return dsData.Phase;
      }

braucht der obere codeabschnitt unter 1sek benötigt das zweite 7 sekunden.

26.04.2011 - 22:49 Uhr

ja, also im management studio ist das was auf 0,1 sekunden,...
für mich persönlich sind diese daten trotzdem nicht sooo arg viel, im gegensatz zu richtig großen datenmengen...
ich werde gezwungener maßen meine ganze logik überarbeiten müssen und immer nur die letzten 100 datensätze von der datenbank holen (was allerdings auch zu verzögerungen führt, weil ich immer wieder daten von der DB holen muss)

Am anzeigen selbst liegt es nicht, da die Zeit beim ablegen in der typisierten datatable vergeht (was auch der grund für die schnelle abfrage im managementstudio sein wird - weil dort die daten nur ausgegeben werden und nicht in eine typisierte datatable gepackt werden müssen)

wobei ich finde, dass es alles etwas verkompliziert wenn ich immer nur 100 datensätze anzeige, da ich auch summen der gefilterten daten ausgeben will. Das heißt ich muss da wiederum für die berechneten summen etc. wieder abfragen an der datenbank machen

26.04.2011 - 21:08 Uhr

also was ich vergessen habe zu sagen, es handelt sich um typisierte datatables und ja, es ist bei jedem laden von der datenbank das gleiche

26.04.2011 - 19:53 Uhr

verwendetes Datenbanksystem: MSSQL 2008

Hallo Leute,

habe wieder mal ne Frage.

Und zwar hab ich rund 50 000 Einträge in einer Tabelle der Datenbank, die ich mittels TableAdapter in eine typisierte DataTable speichern will.
Jeder Eintrag dieser Tabelle besitzt rund 50 Spalten (die meisten davon sind vom Datentyp bit - also dementsprechend klein und die übrigen sind integer werte)

Das Laden dauert rund 7-10 Sekunden. Ist das normal oder was kann hier der grund für die lange laufzeit sein? Sind ja jetzt nicht unbedingt viele Daten.

LG und danke im Voraus!

15.04.2011 - 16:38 Uhr

okay, hab ich nun mit dem using block versucht, aber was hier das komische an der sache ist, ist folgendes:

ich setze mir am ende des form_closing einen breakpoint, dann steppe ich weiter zeilenweise weiter. nach verlassen des form_closing schließt sich die Form, dann verstreichen 10 sekunden, in denen die Aufruferform blockiert und nach verstreichen dieser 10 sekunden, wird erst die disposemethode des dialogforms aufgerufen und ausgeführt.

was wird da sonst dazwischen noch ausgeführt, wo er blockieren könnte?

Dieser Effekt tritt immer beim estmaligen Laden der Form auf und dann nur noch sporadisch.

13.04.2011 - 23:40 Uhr

Hallo,

da es mir sehr viel Zeit gekostet hat und ich schon teilweise frustriert worden war...

Hier meine Fehler. ich hatte die Displayindexanordnung im Konstruktor des Forms.
Als ich die gesamte Anordnung ins onLoad gepackt hatte, funktionierte alles so wie gewünscht!

dgv["c1"].DisplayIndex = 0;
dgv["c2"].DisplayIndex = 1;
.
.
.

13.04.2011 - 22:40 Uhr

Setze mal einen Breakpoint im Dispose des Forms.. und dann schrittweise vorwärts... ev. braucht da was so lange..

und wenn das dispose gar net ausgeführt wird !??!?

13.04.2011 - 13:07 Uhr

Hallo,

ich beobachte des längeren schon folgendes Szenario.

Ich starte eine neue Form mit showDialog() und warte auf ein Dialogresult.
Die neue Form öffnet sich. Schließe ich nun diese Form wieder dauert es ca. 10 Sekunden bis ich meinen Haltepunkt im aufrufenden Form erreiche.
Ich verstehe aber nicht, warum dies auftritt. Dazwischen wird kein Code ausgeführt.

Dieses Problem tritt nur bei Forms auf, wo GMap eingebunden ist (Problem tritt aber auch auf, wenn ich alle Funktionalitäten von GMap auskommentiere)

Kann mir hier jemand weiterhelfen?

09.03.2011 - 16:41 Uhr

vor der compilierung kann man gar nichts zuweisen. Aber mein letzten Post kannst du dahingehend interpretieren, dass du die Columns doch einfach in der Reihenfolge zufügen kannst, in der sie hinterher angezeigt werden sollen.

(oder gleich den Designer benutzen :evil: )

mhm, also ich glaube in meinem Fall ist das nicht ganz so einfach. Grund ist folgender:

Ich arbeite mit DataTables. Ich hole mir mittels TableAdapter eine Table von der Datenbank (gejointe Abfrage - Ortsname zu jedem Kunden hinzufügen) Diese setze ich dann als Datasource in meinem DGV.
Ich kann hier mit dem Designer die Columns nicht anordnen, weil die Column Ortsname im Designer ja nicht erscheint, wenn ich die Datatable Kunde an das DGV binde, weil die Ursprungstabelle Kunde ja nicht über die Spalte Ortsname verfügt.

Daher weise ich derzeit zur Laufzeit die Datatable mit den gejointen Werten dem DGV als Datasource zu, und ändere danach die Displayindizes, was aber eben wie bereits beschrieben nicht funktioniert.
Müsste doch trotzdem so funktionieren wie ich bereits gepostet habe.

   
      DataView dv = new DataView(dal.KundenMitOrt);
      ...
      dgvKunden.DataSource = dv;

      dgvKunden.Columns["KundeID"].DisplayIndex = 10;
      dgvKunden.Columns["Strasse"].DisplayIndex = 3;
      dgvKunden.Columns["Hausnummer"].DisplayIndex = 4;
      dgvKunden.Columns["Telefon"].DisplayIndex = 6;
      dgvKunden.Columns["Handy"].DisplayIndex = 7;
      dgvKunden.Columns["Fax"].DisplayIndex = 11;
      dgvKunden.Columns["Kommentar"].DisplayIndex = 12;
      dgvKunden.Columns["PLZ"].DisplayIndex = 5;
      dgvKunden.Columns["Email"].DisplayIndex = 13;
      dgvKunden.Columns["KontoNr"].DisplayIndex = 14;
      dgvKunden.Columns["BLZ"].DisplayIndex = 15;
      dgvKunden.Columns["VerhName"].DisplayIndex = 9;
      dgvKunden.Columns["Vorname"].DisplayIndex = 2;
      dgvKunden.Columns["Nachname"].DisplayIndex = 1;
      dgvKunden.Columns["Ansprache"].DisplayIndex = 16;
      dgvKunden.Columns["KundenNr"].DisplayIndex = 0;
      dgvKunden.Columns["deleted"].DisplayIndex = 17;
      dgvKunden.Columns["Hausname"].DisplayIndex = 8;
      dgvKunden.Columns["Ortsname"].DisplayIndex = 18;

09.03.2011 - 15:25 Uhr

ja, ich hab mir die sich ändernden displayindizes angesehen.
sie werden auch korrekt zugeteilt wie ich es angezeigt haben haben, nur werden sie komischerweise nicht in dieser reihenfolge angezeigt.

mit 3. alternative meinst du die datasourcezuweisung vor der compilierung?

08.03.2011 - 01:39 Uhr

ja, aber dann verstehe ich nicht warum es nicht funktioniert, wenn ich es auf beide Varianten versuche.

  1. Datasource muss ich ja vorher setzen, sonst bekomme ich ja eine null-reference exception

  2. habe ich nach setzen der Datasource versucht, die Displayindizes nach auftreten in der Datasource zuzuweisen. Habe aber auch versucht die Indizes aufsteigend zuzuweisen.

In beiden Fällen kein brauchbares Ergebnis. Wo sitze ich hier auf der Leitung?

08.03.2011 - 00:57 Uhr

wenn ich mir anschaue wie gewisse werte des reportdocuments gesetzt sind, bekomme ich bei fast allen attributen folgende Fehlermeldung angezeigt:

Bsp:> Fehlermeldung:

Container = Function evaluation disabled because a previous function evaluation timed out. You must continue execution to reenable function evaluation.

wie kann man das deuten?

07.03.2011 - 17:18 Uhr

Ja, ich arbeite mit TableAdapters und mit der normalen Fill-Funktion...
Bei anderen Konstellationen funktioniert es ja.
Ich nütze andere Reports, wo ich ja den Kundennamen etc auch ausdrucke. Es funktioniert nur in diesem Fall nicht,... (ich weiß aber nicht woran es liegt)

07.03.2011 - 11:34 Uhr

ich werd das gleich nochmals versuchen, vorher muss ich aber noch was erledigen.
Danke für die Hilfe derweil, aber welche meiner beiden genannten lösungen ist richtig, oder stimmt da keine?

07.03.2011 - 11:17 Uhr

Hallo,

ich hätte eine Frage zu einem Reportproblem, dass ich noch nicht ganz verstanden habe.

Ich habe ein DataSet mit mehren Tables... Ich kann Felder verschiedener Tables auch anzeigen lassen, funktioniert einwandfrei. NUR, wenn ich Felder der Tabelle Kunde anzeigen will (zB Nachname), dann bekomme ich immer einen leeren Bericht. Entferne ich das Feld Nachname wieder vom Bericht, funktioniert alles wieder einwandfrei...
Woran kann das liegen?
(Tabellen sind alle korrekt gefüllt)

Tabellenstruktur im Groben: Kunde -> WF -> Phase
(Ein Kunde hat mehrere WF, wobei jede WF mehrere Phasen hat, das Attribut KundeID ist in allen 3 Tabellen vorhanden)


 DataSet ds = dal.getDataSet;
      ReportDocument rdoc = new rpTerminePhase();
      rdoc.SummaryInfo.ReportTitle = "überfällig";
      DataView dvAp = new DataView(ds.Tables["Phase"]);
      dvAp.RowFilter = "deleted = 0 AND Jahr < " + DateTime.Now.Year.ToString() + " OR (Jahr = " + DateTime.Now.Year.ToString() + " AND QuartalID < " + (DateTime.Now.Month / 4 + 1).ToString() + ")";
      //same sortion mode as datagridview on dataview
      if (dgvTermine.SortedColumn != null) {
        string mode = "DESC";
        if (dgvTermine.SortOrder.ToString().Equals("Ascending")) {
          mode = "ASC";
        }
        dvAp.Sort = dgvTermine.SortedColumn.Name + " " + mode;
      }
      
      dsPhase dl = new dsPhase();
      dl.Phase.Merge(dvAp.ToTable(), false);
      dl.WF.Merge(dal.WF);
      dl.Ort.Merge(dal.Orte);
      dl.Kunde.Merge(dal.Kunden);
      dl.Massnahme.Merge(dal.Massnahmen);
      dl.Massnahmendringlichkeit.Merge(dal.PhasenMassnahmen);
      rdoc.SetDataSource(dl);
      rdoc.Refresh();
      ReportView rview = new ReportView(rdoc);
      rview.ShowDialog();
      dl.Dispose();
      dvAp.Dispose(); 

07.03.2011 - 10:19 Uhr

nein, ich hab sie vorher gesetzt, sonst bekomm ich ja an fehler, dass die spalte gar nicht existiert

06.03.2011 - 23:52 Uhr

ich hätte es jetzt versucht, aber es führt trotzdem nicht zum gewünschten ergebnis.

ich ordne genau nach anzeige im datagridview ohne setzten des displayindizes zu, aber rauskommen tut wieder wirrwarr

      dgvKunden.Columns["KundeID"].DisplayIndex = 10;
      dgvKunden.Columns["Strasse"].DisplayIndex = 3;
      dgvKunden.Columns["Hausnummer"].DisplayIndex = 4;
      dgvKunden.Columns["Telefon"].DisplayIndex = 6;
      dgvKunden.Columns["Handy"].DisplayIndex = 7;
      dgvKunden.Columns["Fax"].DisplayIndex = 11;
      dgvKunden.Columns["Kommentar"].DisplayIndex = 12;
      dgvKunden.Columns["PLZ"].DisplayIndex = 5;
      dgvKunden.Columns["Email"].DisplayIndex = 13;
      dgvKunden.Columns["KontoNr"].DisplayIndex = 14;
      dgvKunden.Columns["BLZ"].DisplayIndex = 15;
      dgvKunden.Columns["VerhName"].DisplayIndex = 9;
      dgvKunden.Columns["Vorname"].DisplayIndex = 2;
      dgvKunden.Columns["Nachname"].DisplayIndex = 1;
      dgvKunden.Columns["Ansprache"].DisplayIndex = 16;
      dgvKunden.Columns["KundenNr"].DisplayIndex = 0;
      dgvKunden.Columns["deleted"].DisplayIndex = 17;
      dgvKunden.Columns["Hausname"].DisplayIndex = 8;

auch so funktioniert es nicht:


      dgvKunden.Columns["KundenNr"].DisplayIndex = 0;
      dgvKunden.Columns["Nachname"].DisplayIndex = 1;
      dgvKunden.Columns["Vorname"].DisplayIndex = 2;
      dgvKunden.Columns["Strasse"].DisplayIndex = 3;
      dgvKunden.Columns["Hausnummer"].DisplayIndex = 4;
      dgvKunden.Columns["PLZ"].DisplayIndex = 5;
      dgvKunden.Columns["Telefon"].DisplayIndex = 6;
      dgvKunden.Columns["Handy"].DisplayIndex = 7;
      dgvKunden.Columns["Hausname"].DisplayIndex = 8;
      dgvKunden.Columns["VerhName"].DisplayIndex = 9;
      dgvKunden.Columns["KundeID"].DisplayIndex = 10;
      dgvKunden.Columns["Fax"].DisplayIndex = 11;
      dgvKunden.Columns["Kommentar"].DisplayIndex = 12;
      dgvKunden.Columns["Email"].DisplayIndex = 13;
      dgvKunden.Columns["KontoNr"].DisplayIndex = 14;
      dgvKunden.Columns["BLZ"].DisplayIndex = 15;
      dgvKunden.Columns["Ansprache"].DisplayIndex = 16;
      dgvKunden.Columns["deleted"].DisplayIndex = 17;
06.03.2011 - 23:25 Uhr

ja, der verändert sich komischerweise wieder,...
wie kommt es dazu, oder warum ist das so?

ich versteh das ganze irgendwie nicht,...
ich habe jetzt auch versucht, mal alle spalten auszublenden. dann die erste einzublenden, den index zu setzen und dann mit den nächsten gleich verfahren,...
das führt aber auch zu nichts brauchbarem

05.03.2011 - 21:11 Uhr

hallo.

ich hab mich schon in die materie eingelesen, aber nur leider funktioniert es bei mir nicht wie es soll.
Kann mir hier jemand sagen was ich falsch mache.

Ich erzeuge ein Datagridview und binde es zu laufzeit an eine datasource.
nach dieser bindung führe ich folgenden code aus:


      dgvKunden.Columns["KundenNr"].DisplayIndex = 0;
      dgvKunden.Columns["Nachname"].DisplayIndex = 1;
      dgvKunden.Columns["Vorname"].DisplayIndex = 2;
      dgvKunden.Columns["Strasse"].DisplayIndex = 3;
      dgvKunden.Columns["Hausnummer"].DisplayIndex = 4;
      dgvKunden.Columns["PLZ"].DisplayIndex = 5;
      dgvKunden.Columns["Telefon"].DisplayIndex = 6;
      dgvKunden.Columns["Handy"].DisplayIndex = 7;
      dgvKunden.Columns["Hausname"].DisplayIndex = 8;
      dgvKunden.Columns["VerhName"].DisplayIndex = 9;

vorher blende ich noch ein paar spalten aus.

Eigentlich sollte ja jetzt zuerst die kundennr, dann der nachname etc angezeigt werden.
Bei mir ist das allerdings nicht der fall (kundennr, strasse,...)

warum funktioniert das nicht?

22.02.2011 - 10:11 Uhr

hallo,

das verstehe ich jetzt nicht.
Ich will ja auf jede einzelne ausgewählte row zugreifen.
Was mache ich da dann mit dgvA.selectedRows.count??
Das liefert mir ja einen int Wert, ich brauche ja die row.
Das Beispiel fand ich so auf msdn, nur das es komischerweise nicht so funktioniert wie es soll.

ich habe auch versucht, dass ich über alle rows iteriere, und nur die bearbeite, wo der Status selected ist. das funktioniert aber auch nicht. Nach Änderung der ersten Zeile, sind keine weiteren mehr selected.
Woran liegt das?

21.02.2011 - 22:52 Uhr

Hallo,

kann mir bitte jemand erklären woran es hier liegt, dass ich hier folgenden Fehler bekomme:
Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: index

  1. ich markiere 3 rows im dgv
  2. ich klicke auf einen button, der den unten stehenden code ausführt

private void btnStatus_Click(object sender, EventArgs e) {
      if (dgvA.SelectedRows.Count > 0 &&  cbxStatus.SelectedIndex >= 0 && cbxStatus.SelectedIndex <= 1) { 
        //change selected rows
        int selRowsCnt = dgvA.Rows.GetRowCount(DataGridViewElementStates.Selected);//hier sind 3 rows selected
        if(selRowsCnt > 0){
          VS.ADataTable ap = dal.A;

          for (int i = 0; i < selRowsCnt; i++) { //hier nur mehr eine selected, warum?
            int aId = Convert.ToUInt16(dgvA.SelectedRows[i].Cells["AId"].Value);
            int kId = Convert.ToUInt16(dgvA.SelectedRows[i].Cells["KId"].Value);

            VS.ARow editRow = ap.FindByAIdIDKID(aId, kId);

            if (cbxStatus.SelectedIndex == 0) {
              //set status to offen
              editRow.offen = true;
            } else {
              //set status to abgeschlossen
              editRow.offen = false;
            }
          }
    
          dal.A= null;
          refreshA();
        }       
      }
    }

21.02.2011 - 10:21 Uhr

Hallo,

kann mir jemand sagen, warum folgender Code im Report keine Daten anzeigt, obwohl es meiner Meinung nach passen müsste.

dv ist mein DataView, welcher 4 Zeilen beinhaltet.
reportview ist eine form, der das Dokument übergeben wird und dort angezeigt wird.


      ReportDocument rdoc = new ReportDocument();
      rdoc = new KundeDetail();
      rdoc.SetDataSource(dv.ToTable());

      ReportView rview = new ReportView(rdoc);
      rview.Show();

was mache ich hier falsch, oder woran kann das Problem liegen?

18.02.2011 - 15:37 Uhr

Hallo,

ich verstehe folgendes nicht:

  1. ich erzeug mir eine neue View, der ich eine typisierte Datatable übergebe (dataPhasen) - 4 rows
  2. filtere ich die view - 2 rows bleiben übrig
  3. möchte ich aus der view eine table erzeugen und einer neuen Datatable zuweisen
  • 0 rows

warum hab ich in schritt 3 im ergebnis keine row? eigentlich müsste ich ja auch 2 haben!

      DataView res1 = new DataView(dataPhasen);
      res1.RowFilter = phFilter;
      DataTable resDt = res1.ToTable();

16.02.2011 - 17:22 Uhr

hallo,

dataPhasen ist derzeit eine DataTable (typisiert)
mit diesem statement möchte ich alle tupel von kundeID und FlaecheID herausfiltern (distinct).
Dadurch kann ich erreichen, dass ich Bestimmen kann wieviele verschiedene Flächen es wirklich gibt.
Davon bestimme ich dann die Anzahl der Datensätze und gib diesen count aus.

Das klappt alles soweit so gut, aber eben auf allen Daten der DataTable dataPhasen.
Mein DataView selektiert aber dynamisch Datensätze der DataTable (zur Laufzeit). RowFilter wird zusammengestopselt. Daher möchte ich auch nur auf diesen selektierten Daten arbeiten, was aber mit dem unten stehenden code nicht funktioniert.

      
var result = (from myRow in dataPhasen
                  select new { myRow.KundeID, myRow.FlaecheID }).Distinct();

txtRes.Text = result.Count().ToString();

auch versucht habe ich folgendes, funktionierte aber nicht

      
var result = (from myRow in dataview1.ToTable()
                  select new { myRow.KundeID, myRow.FlaecheID }).Distinct();

txtRes.Text = result.Count().ToString();

Also, entweder es gibt eine Möglichkeit dass ich auf der DataTable mit linq selektiere indem ich auch den rowfilter der dataview verwende (weiß aber nicht wie), oder ich arbeite auf dne selektierten Daten des Dataviews mit linq