@dannoe: hach, wie geil ist das denn..kannte ich so ja gar nicht..thx...
Hallo,
bitte erschlagt mich nicht gleich.
Ich möchte mir ein wenig Erleichterung beim Extrahieren von Daten aus .JSON-Dateien verschaffen (alles manuell per copy&paste dauert bissl)..
Ich hab null Plan von Deserialisierung einer solchen Art und tue mich grade mit google bzw. dem Verstehen von dem was ich finde ein wenig schwer...
Kann mir wer hier mal ein paar Anschübe dahingehend geben wie ich es hinbekomme alle Daten der einzelnen Felder auszulesen / in ne Klasse zu packen, ohne dass ich den ganzen Text durchgehe und immer wieder nach ":" oder so in der Art suche und die einzeln abspeichern muss..
Klasse erstellen für die ganzen Unterknoten finde ich schon recht seltsam.
Gefundene Beispiele sind immer nur ein Hauptknoten und ein "Unterfeld"
Hier wie solch eine aufgebaut ist:
{
"test":true,
"version":"2.0",
"Angelegenheit":
{
"Tatsache":
{
"Fallart":"K",
"Tatsache spez":
{
"Faktencode":"R545",
"Kategorie":"1"
},
"Sammlung":
{
"Betrag":"120.0"
},
"DatumZeit":"2022-05-02T11:47:37+02:00",
"Officer":
[
{
"Seriennummer":"1",
"Mitarbeiternummer":"160101"
}
],
"Pflegestelle":
{
"Stadtcode":"1234",
"Straßencode":"1",
"Straßenname":"A27",
"HektoM":"69.7",
"igO":"N"
},
"Fahrzeug":
{
"Fahrzeugcode":"BA",
"Ländercode":"6030",
"Kennzh":"B-12432"
},
"Optionen":
[
{
"Stichwort":"R545",
"Option":"1EigeneWahr7Golden",
"Variabeln":
[
{
"spezVariable":"Gründe dafür",
"Freitext":"selbstverschuldet"
}
]
}
]
},
"Validierung":
[
{
"Code":"RDW",
"ausgefuehrt":"N"
}
],
"LParameter":
{
"AngabenErhalten":"J",
"GrundNachbearbeitung":"OVT"
},
"Anhaenge":
[
{
"Anhangcode":"33",
"Anhangname":"12432.jpg",
"mimetype":"image/jpeg",
"Inhalt":"..."
}
],
"Projekt":
{
"Projektcode":"MAN"
}
}
}
Der Thread ist zwar paar Tage alt aber ne andere Möglichkeit über das Event der GroupBox:
private void groupBox2_Validated(object sender, EventArgs e)
{
GroupBox g = sender as GroupBox;
var a = from System.Windows.Forms.RadioButton r in g.Controls
where r.Checked == true
select r.Name;
MessSystem = a.First();//Text des ausgewählten RadioB in den string MessSystem packen
}
p.s. steinigt mich, wenn das "böse" ist aber es funktioniert super...
Guter Gedanke, zumindest erlaubt der zweite Parameter das Verstecken.
Müsste man aber mal testen, ob bereits sichtbare Fenster auf diese Weise versteckt werden können, hab ich bisher nie versucht.
Ja geht,
hab ich ja wie gesagt in meinen kleinen Progrämmchen so... der versteckt mir sogar Diablo III beim "Arbeiten" 🙂
Da er das Programm ja nicht schliessen will, ist doch hier eher ShowWindow gefragt??
Damit kann man das Fenster doch quasi "verstecken".
Zumindest hab ich das in meinen "Boss-Kommt-Rein"-Programm so 🙂
ganz dumme q&d-Lösung wäre doch auch einfach ein .Split mit dem Zeichen "N" - auch wenn man den zweiten Teilstring nicht mehr benötigt...
Ich nutze die Suche über die DT (ja, ne extra Spalte für jede Zeile, aber funzt sehr gut und einfach):
private void Suchfeld_TextChanged(object sender, EventArgs e)
{
Suchfilter(true, Suchfeld.Text);
}
private void Suchfilter(bool fragment, string Suchbegriff)
{
dt_Geraete.DefaultView.RowFilter = string.Format("[_RowString] LIKE '%{0}%'", Suchfeld.Text);
}
private void Suchfeld_anlegen()
{
if (ColumnExistsInTable(dt_Geraete, "_RowString") == true)
dt_Geraete.Columns.Remove("_RowString");
DataColumn dcRowString = dt_Geraete.Columns.Add("_RowString", typeof(string));
foreach (DataRow dataRow in dt_Geraete.Rows)
{
StringBuilder sb = new StringBuilder();
for (int i = 0; i < dt_Geraete.Columns.Count - 1; i++)
{
sb.Append(dataRow[i].ToString());
sb.Append("\t");
}
dataRow[dcRowString] = sb.ToString();
}
SQL_GeraeteDataGrid.Columns["_RowString"].Visible = false;
}
private static bool ColumnExistsInTable(DataTable dataTable, string columnName)
{
return dataTable.Columns.IndexOf(columnName) != -1;
}
p.s. nicht von mir..
und als Zusatz kannste die case/switch bissl entschlanken:
System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(Monatszahl)
Hiho,
ich habe jetzt verschiedene Builds probiert um ein Single-File wie noch vor .net5 zu erstellen.
Ich bekomme entweder
Ist es nicht mehr möglich wie bisher kurze knappe .exe zu erzeugen (ohne die zusätzliche gleichnamige .dll) ??
Property z.B:
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net5.0</TargetFramework>
<PublishSingleFile>true</PublishSingleFile>
<SelfContained>true</SelfContained>
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
<PublishTrimmed>true</PublishTrimmed>
<PublishReadyToRun>true</PublishReadyToRun>
</PropertyGroup>
...
daher gibt es auch in 99,9999% aller Applikationen, die Access verwenden, Datenverluste und andere Probleme mit Access.
...
Zum Glück hat das niemand, in den 18 Jahren in denen unsere sehr umfangreichen Access-Applikationen liefen, denen gesagt.
Sorry für OT - konnte ich mir nicht verkneifen..
Hi gfoidl,
das kannte ich so noch gar nicht.
Sieht sehr interessant aus und muss ich mir mal zur Gemüte führen.
Sieht aber sehr vielversprechend aus, danke..
das mit dem zusammenbauen und wieder aufteilen waren fragmente des probierens...mus sich später ins reine schreien..
Danke dir, das hilft...
als .txt hochgeladen
Huhu gfoidl,
die Dateien haben eine Größe von ca. 80kb bis ca. 300kb - je nach Anzahl der darin enthaltenen Datensätze.
Das erste Aufkommen des Suchtextes (im Bild ersichtlich mit XSA40.... hat zum nächsten Suchtext XSA40... den gleichen Abstand.
Aber eben den ersten zu finden ist tricky...
Vom Suchtext aus lese ich mir dann die gelbmarkierte Zahlen aus..
Das ist mein Versuch wenn ich die Position des ersten Datensatzes kenne (im Hex-Edit geschaut):
(funktioniert so weit auch..)
string st = "";
BinaryReader br = new BinaryReader(File.OpenRead(directoryItem));
br.BaseStream.Position = 0xEED4; //4 Zeichen für Listennummer
while (br.BaseStream.Position < br.BaseStream.Length)
{
foreach (char mychar in br.ReadChars(4))
{
st += mychar.ToString();
}
st += "=";
br.BaseStream.Position += 0x38c; //
foreach (char mychar in br.ReadChars(6))
{
if (mychar == 0)
{
st += "999999";//bestimmte DS haben keine Nummer vorgegeben- setze universelle
break;
}
st += mychar.ToString();
}
st += ";";
br.BaseStream.Position += 0x2fa;
}
br.Dispose();
string[] t = st.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
char[] separatorArray = { '=' };
HashSet<string> dedupl = new HashSet<string>();
var res = t
.Select(s => s.Split(separatorArray))
.Where(x => dedupl.Add(x[0]))
.ToDictionary(x => x[0], x => x[1]);
p.s.: Der Typ der Datei Testdat.dat kann nicht hochgeladen werden.
Hi,
also der Suchtext steht als Plain-Text drin.
Nach dem Text steht das was ich auslesen muss in immer fixem Abstand zum Suchtext ebenfalls als Plain-Text drin.
Auslesen per BinraryReader und dann per .BaseStream.Position ... ist an für sich kein großes Problem aber eben den Suchtext zu finden schon. 😦
Ich komme da auf keinen grünen Zweig oder denke da zu verquert...
Hi,
bräuchte mal ein Schubs in folgender Richtung:
Ich habe eine Datei (kein Text) in der aber an bestimmten Positionen Klartextstücke stehen.
Diese müsste ich suchen und ab da dann an festen Postionen Zahlen auslesen.
Bsp. an Position ( hex ) FF2D kommt der Suchtext "blabla" und nach diesem an Position z.B. +540 Zeichen steht das was ich auslesen muss..
Dies wird innerhalb der Datei mehrmals wiederholt immer vom gleichen Suchtext an mit gleichem Abstand wie oben genannt der auszulesende....
Wie gehe ich da am bersten vor??
also wenn das Array vorgegeben ist denke ich ist die Lösung:
32, 32, 67, 67, 32, 32, 32, 35, 32, 35, 32
...
" cc # # "
...
sind doch ASCII-Codes im Array, oder??
so bekäme man 7 Zeilen mit je 11 Zeichen..
OK,
nach langem Hin- und Her doch noch:
DirectoryEntry fs = new DirectoryEntry("WinNT://SERVERNAME/lanmanserver,Fileservice");
ActiveDs.IADsFileServiceOperations iads_fs = (ActiveDs.IADsFileServiceOperations)fs.NativeObject;
foreach (ActiveDs.IADsSession oSession in iads_fs.Sessions())
{
sdf.Add(oSession.User + ";" + oSession.Computer);
}
die Antwort ist leicht: weil ich absolut nicht weiß, wie ich das Skipt in c# umsetzen kann..
Ich sitze da schon tagelang dran und google mir die Finger wund..
Skript funzt einwandfrei und wird per
Process scriptProc = new Process();
scriptProc.StartInfo.CreateNoWindow = true;
scriptProc.StartInfo.UseShellExecute = false;
scriptProc.StartInfo.FileName = @"cscript";
scriptProc.StartInfo.WorkingDirectory = Application.StartupPath + @"\Resources\";
scriptProc.StartInfo.Arguments = "//Nologo getpc.vbs " + title;//Title ist der Übergabeparam
scriptProc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
scriptProc.Start();
aufgerufen
Hallo,
ich habe ein VBS mit nachfolgendem Inhalt, das ich über eine C#-Form-Anwendung aufrufe:
Dim oSession
Set fs = GetObject("WinNT://" & "SERVERNAME" & "/lanmanserver, FileService")
Set FSO = CreateObject("Scripting.FileSystemObject")
Set MyFile = FSO.OpenTextFile("IP_Liste.txt", 8)
For Each oSession In fs.Sessions
On Error Resume Next
If InStr(oSession.user, WScript.Arguments(0)) <> 0 Then 'userlogin übergeben
MyFile.WriteLine (oSession.computer)
End if
Next
MyFile.Close
welchem ein loginname übergeben wird und das über das Object (fs) dessen IP-Adresse auf dem Server ausliest und in eine Datei hinzuspeichert.
Ich möchte gerne das VBS in c# implementieren, damit dies nicht mehr extern notwendig wird.
Leider scheitere ich an gerade allem und Google mag mich die Tage nicht..
Das Objekt holen klappt ja noch, wenn ich über hinzugefügten VB-Verweis gehe:
object ofs = Microsoft.VisualBasic.Interaction.GetObject(@"WinNT://" + "SERVERNAME" + "/lanmanserver, FileService");
Das weitere aber scheitert kläglich..zudem hat das erzeugte Objekt kein iEnum usw..
Hat da jmd Tipps??
Grds. haben alle diese Zeilen max. 30 Spalten bzw. Marker von 001* bis 030* aber eben nicht immer alle vorhanden.
UTF8 - ok:
System.IO.File.WriteAllText("Standorte_bereinigt.csv", sb.ToString(), Encoding.UTF8);
arghh StringSplitOption.RemoveEmpty ... Stirnklatsch. Danke
...
Sind die Marker nicht schon pro Zeile sortiert?
Falls nicht, würde dein Ansatz mit der Prüfung stimmen.
Ansonsten wäre auch dieser überflüssig und könnte entfallen....
T-Virus
An für sich sortiert aber eben nicht zwingend fortlaufend, deswegen die Prüfung auf die Zahl, damit ich fehlende Marker als Semikolon in der CSV ersetze und den Inhalt des nächsten vorhandenen Markers an die richtige Position schreibe.
Hi T-Virus,
ja bei den ersten beiden Absätzen gebe ich dir vollkommen recht.
Da muss ich dringend Hand anlegen.
Was die Prüfung mit ie und plen angeht ist in der Textdatei wie oben im Beispiel ein abschliessendes Pipe weswegen der Code ohne den break in ner endlosschleife münden würde.
Die Prüfung der Nummern (inkl dem *, weil wie du anmerkst leider auch im Text vorkommen kann) habe ich so, damit die Reihenfolge der Daten für die zu erstellende csv eingehalten wird bzw. die Semikolon bis zur nächsten Nummer (Marker) gesetzt werden.
Das ist ja mein Knackpunkt wie ich das anders umsetzen soll.
Ziel soll ja z.B. eine Zeile so sein:
Text1;Text2;;Text4;;;;Text8;;;;;;;;;;TextXX;;;
usw.
Hallo,
ich habe eine Liste mit vielen Zeilen die folgendermaße aufgebaut ist:
001*text1|002*Text2|004*Text4|
001*text11|002*Text22|003*Text3|009*Text9|
...
Pro Zeile gibt es beliebig viele Einträge bis ca. 30 - aber nicht jede Nummer von 001* - 030* muss belegt sein
Ich möchte diese Liste gerne neu schreiben ohne die Marker (001*, 002* usw.. und dazwischen statt dem Trenner "|" ein Semikolon schreiben)
Ich habe mit folgendem Code das Ergebnis aber irgendwie ist das totaler Rübensalat..:
public int sKFilter = 1;
public string sKZaehler="001";
private void RemoveAllUnneededChars(string path)
{
StringBuilder sb = new StringBuilder();
string[] lines = File.ReadAllLines(path, Encoding.UTF8);
foreach (string line in lines )
{
string[] parts = line.Split('|');
int plen = parts.Count()-1;
int ie = 1;
sKFilter = 1;
foreach (string part in parts)
{
if (ie > plen)
break;
sKZaehler = sKFilter.ToString("D3") + "*";
string shelp = part.Substring(0, 3);
if (part.StartsWith(sKZaehler))
{
sb.Append(part.Substring(part.IndexOf(sKZaehler) + 4) + ";");
sKFilter = sKFilter + 1;
}
else
{
while (sKZaehler.Substring(0,3) != shelp)//nxt part ist nicht gleich der Nummer
{
sb.Append(";");
sKFilter = sKFilter + 1;
sKZaehler = sKFilter.ToString("D3") + "*";
}
sb.Append(part.Substring(part.IndexOf(sKZaehler) + 4) + ";");
sKFilter = sKFilter + 1;
}
ie++;
}
sb.Append(Environment.NewLine);
}
System.IO.File.WriteAllText("Standorte_bereinigt.csv", sb.ToString());
}
Wäre echt nett, wenn da mal jmd drüber kucken könnte und mir mal Tipps geben könnten, das bissl zu verschönern..
Hi,
ich finde nur immer wieder die Möglichkeit eine Ordner-Freigabe per versteckter cmd mittles "net share" zu erstellen.
Gibt es in c# ne Möglichkeit dies direkt zu erstellen?
Muss doch ne API oder dergleichen geben ?!?
Ich möchte auf dem Server eine Freigabe für einen bestimmten Ordner erstellen.
Wäre nett, wenn da jmd. einen Ansatz hätte (nehme auch gerne fertiges 😃 )
Hallo,
danke für die Hilfe und genau das was Th69 schrieb meinte ich.
Hi,
ich stehe gerade mal wieder komplett auf dem Schlauch.
Ich lese ne Textdatei mit diversen SQL-Abfragen ein (ja, nur ich habe Zugriff darauf..):
Die .txt sieht in etwa so aus:
"Sichtbarer Eintrag der Combox;SQL-Statement;string"
...
var lines = File.ReadLines("Abfragen.txt");
var data = lines.Select(l => l.Split(';'));
List<SQLB> alleSQL = data
.Where(arr => arr.Length >= 3)
.Select(arr => new SQLB
{
Name = arr[0],
sql = arr[1],
saver = arr[2]
})
.ToList();
var bindingSourceSQL = new BindingSource();
bindingSourceSQL.DataSource = alleSQL;
comboBox1.DataSource = bindingSourceSQL.DataSource;
comboBox1.ValueMember = "sql";
comboBox1.DisplayMember = "Name";
...
public class SQLB
{
public string Name { get; set; }
public string sql { get; set; }
public string saver { get; set; }
}
...
Wie greife ich auf den dritten "Parameter" zu ("saver") der im Array steht?
das ist zwar alt, aber das beinhaltet tipps für dich..
Abgesehen davon haben Reverse Engineers bisher immer "gewonnen".
Einen richtigen Schutz gibt es nicht wirklich.
Wir haben früher alles gecracked was auf dem Markt war, da gab es keine Hindernisse..
Heute bin ich genau auf den anderen Seite..aber auch da gewinnen die anderen..
sry..
ergänzt; dachte AD und newUser erklärt sichvon selber..
Hi,
ich stehe grad mal wieder aufm Schlauch und Google spuckt mir nur Müll aus (bin zu blöd zum Suchen)..
Mit z.B.
...
connectionPrefix= @"LDAP://ou=Benutzer,ou=zw02,ou=pplu,dc=xxx,dc=rlp,dc=de";
DirectoryEntry dirEntry = new DirectoryEntry(connectionPrefix);
DirectoryEntry newUser = dirEntry.Children.Add(string.Format(@"CN={0}\, {1}", Nachname.Text, Vorname.Text), "user");//OK
...
newUser.Properties["facsimileTelephoneNumber"].Value = Faxnummer;//OK
newUser.Properties["title"].Value = "All";//OK
newUser.CommitChanges();
...
setze ich einzelne Werte in den Properties des Users.
Habe aber auch Properties mit mehrzeiligen Werten (wird ja ein Array sein).
Wie setzt man diese??
edit: newUser ergänzt..
Statt **null **benutzt man in F# Options
...
Kurz als Vergleich:
Es gibt über 1500 Jobs in Stuttgart, die einen C# Entwickler suchen.
F#:** Null **(In Zahlen: 0).
....
sorry, konnte ich mir nicht verkeifen 😃
Hi Chilic,
ja ich lese jetzt alle Verzeichnisse im 2.ten LW/Pfad einmalig in ein Array und lasse dann prüfen..
Die neuen Dirs aus dem 1.ten sind auch von der Anzahl her max 3-8, so dass dies augenmerklich auch nicht feststellbar ist bzw. solch eine Prüfung nur einmal am Tag genutzt wird...
p.s. ja, der der Server packt locker diese Anzahl an Verzeichnissen 😃
Das Anzeigen in einem Explorer dauert schon etwas..aber das brauche ich ja so nicht..
Danke,
auch wieder was gelernt...
Hi T-Virus,
das einzige was noch fest im 2.LW wäre, dass hinter dem sCommL ein Unterstrich folgt ("_").
Das ist das einzige fixe folgende Zeichen..danach diverse Bezeichner.
Ich habe es fast schon befürchtet, dass dies nicht anders realisierbar ist.
Hallo,
ich versuche es irgendwie hinzubekommen, ein Pfad mit Wildcard abzuprüfen.
Problemstellung:
Ich schaue, ob in einem bestimmten Haupt-Verzeichnis diverse Unterordner liegen (nach immer gleichen Schema) und setze einen neuen Namen zusammen:
...
foreach (string mods in Directory.GetDirectories(sVSPfad"))
{
string sCommL = Path.GetFileName(mods);
sK_PP = Lefts(sCommL, 2); //2 Zeichen ab Start
sVS_Archiv = Mid(sCommL, 4, 6); //6 Zeicehn ab 4.ter Pos
switch (sK_PP)
{
case "01": // KO
sCommL = "A_1_" + sVS_Archiv;
break;
case "02": // MZ
sCommL = "A_2_" + sVS_Archiv;
break;
case "03": // LU
sCommL = "A_3_" + sVS_Archiv;
break;
case "04": // TR
sCommL = "A_4_" + sVS_Archiv;
break;
case "05": // KL
sCommL = "A_5_" + sVS_Archiv;
break;
default: //
break;
}
Jetzt will ich an dieser Stelle in einem anderen Laufwerk/Pfad prüfen, ob es ein Dir mit dem zusammengesetzen "sCommL"-Namen gibt.
Hierbei hängen aber immer hinter dem "sCommL"-DirNamen noch diverse Zeichen dran, die ich nicht bestimmen kann.
Mit Directory.Exists komme ich nicht weiter, da kein Wildcard möglich ist.
Man könnte per Directory.GetDirectories alle auslesen ist aber absolut ineffektiv und unschön, da in diesme Zweiten Laufwerk/Pfad bis zu 50.000 Verzeichnisse existieren.
Gibt es da eine Möglichkeit, denn ich stehe grade enorm auf dem Schlauch bzw. durchtrenne ihn ja fast.
TextWriter sw = new StreamWriter(@"D:\Planet_AS5\Images\Export.txt");
int rowcount = SQL_dataGridView.RowCount;
int colcount = SQL_dataGridView.ColumnCount;
for (int i = 0; i < rowcount; i++)
{
for (int i2 = 0; i2 < colcount; i2++)
{
sw.Write(string.Format("{0};", SQL_dataGridView[i2, i].Value.ToString()));
}
// sw.Write("\n");
}
sw.Close();
ist das nicht das was es soll??
bei mir funktioniert da seit jahren so..
edit: format der ersten Zahl übersehen...
Hallo LaTino,
vielen Dank für diesen Denkanstoß.
Werde ich mir zur Gemüte führen.
Kurzfristig hatte ich eine Quick'nDirty-Variante getestet in dem ich einfach per try/catch den String in der combo.text nach dem Leerzeichen (Aufbau ist immer gleich) abgeschnitten hatte und im catch halt wenn kein Leerzeichen, dann dies übernahm..
War nicht schön aber hatte auf die schnelle funktioniert, zumindest bis ich ne elegante Lösung finde.
ja wie unterscheidet man dies??
wenn ich was eingebe will ich das eingegebene haben und wenn ich selektiere das eben..
da steh ich ja grad quer aufm schlauch..
Combobox.Text geht nicht, weil er mir das zusammengesetze bei Auswahl eines aus der Liste ausgibt (comboBox2.DisplayMember = "FullName";)
Hi,
ich lese Daten einer Textdatei in ne List.
Diese wird mittels DataBinding an ne Combo "gehängt".
{
var lines2 = File.ReadLines(@"mc.txt",Encoding.Default);
var data2 = lines2.Select(l2 => l2.Split(';'));
List<MCB> alleMC = data2
.Where(arr2 => arr2.Length >= 2)
.Select(arr2 => new MCB
{
Ort = arr2[0],
Name2 = arr2[1]
})
.ToList();
var bindingSourceMC = new BindingSource();
bindingSourceMC.DataSource = alleMC;
comboBox2.DataSource = bindingSourceMC.DataSource;
comboBox2.ValueMember = "Ort";
comboBox2.DisplayMember = "FullName";
}
mittels
public class MCB
{
public string Name2 { get; set; }
public string Ort { get; set; }
public string FullName
{
get { return Ort + " " + Name2; }
}
}
setze ich für den Text in der Combo beide zusammen.
Mit comboBox2.SelectedValue.ToString()) bekomme ich den Wert, wenn ich die Combo als **DropDownList **definiere. (werden per Button ausgelesen und dann weiterverarbeitet)
Da ich aber auch Werte direkt in die Combo eingeben (also als "normale" DropDown definiert) möchte, funktioniert das nicht.
Fehlermeldung dann bei eingegeben Wert:
Fehlermeldung:
System.NullReferenceException: "Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt."
Stehe grad aufm Schlauch..
edit: Typo
schon keybd_event probiert??
z.B.:
keybd_event(0x61, 0xcf, 0, 0); // Numpad 1
keybd_event(0x61, 0xcf, KEYEVENTF_KEYUP, 0); //Numpad 1 loslassen
War doch glaub grad letztens gefragt..
ich hab das jetzt anders gelöst:
DataSet dssqlcommand = new DataSet();
dsFeeds.ReadXml("some.xml", XmlReadMode.InferSchema);
SQL_Combo.DataSource = dssqlcommand .Tables["SQL"];
SQL_Combo.DisplayMember = "sqlName";
SQL_Combo.ValueMember = "sqlcode";
Allerdings habe ich jetzt dadurch ein anderes "Problem"
ein Value enthält Hochkommata und eine Stringvariable.
Diese wird so nicht umgesetzt wenn idh dem eigentlichen Command so an SQL übergebe..
Statt z.B.
vorher fest im Programm
sqler = "SELECT COUNT(vorgang.as004) AS Messcode FROM as5db.vorgang vorgang WHERE (vorgang.as022 BETWEEN '" + dt1 + " 00:00:00' AND '" + dt2 + " 23:59:59.998') AND vorgang.as004 = '" + title + "'";
jetzt wird mit
sqler = SQL_Combo.SelectedValue.ToString();
die dt1, dt2 usw. nicht "übersetzt" sondern dies als String übergeben..
Das ist nicht das Problem, das Programm liegt bei mir aufm Server wo ich es brauche..
Schade, dass mit der Bindung das nicht geht.. muss ich halt nochmal was überlegen..
jmd kleiner Schubser??
Hallo Abt,
danke für die Antwort.
Adminrechte sind kein Problem.
Um Änderungen der werte zu erreichen muss man ja nur die .config im Release-Ordner ändern; das ist ja eine einfache "Text"-Datei.
Das wäre kein Thema.
Mein Ziel ist einfach dass ich Werte (einträge der Combo) manuell ändern kann, ohne das programm neu compilen zu müssen.
Hinzu ja noch die Bindung des Eintrages an den entsprechenden Value, der auch in dieser .config steht.
Die Bindung ist mein Knick im Schlauch gerade...
Hallo,
ich stehe grade absolut aufm Schlauch.
Ich möchte aus der app.config - Sektion appSetting:
...
<appSettings>
<add key="a" value="1"/>
<add key="b" value="2"/>
<add key="c" value="3"/>
<add key="d" value="4"/>
<add key="e" value="5" />
</appSettings>
...
die keys als Display-Werte in eine ComboBox bringen.
Je nach ausgewähltem Wert, soll in dem Event SelectedIndexChanged der Combobox ein globaler String mit dem passenden Value "gefüllt" werden.
Mit dem folgenden kann ich die angezeigten Werte in der Combo füllen..
...
foreach (string key in ConfigurationManager.AppSettings)
{
string value = ConfigurationManager.AppSettings[key];
SQL_Combo.Items.Add(key);
Console.WriteLine(value);
}
...
wie binde ich aber die value's daran??
Auch schon versurch über die .GetSection und .Datasource/.DisplayMember... zu binden.. nix geht irgendwie grade...
Absoluter Hänger gerade 😦
Datemnbanken mit Autoincrement-Feldern haben immer die Angewohnheit mit der "angefangenen" Nummer weiter zu machen, als wäre diese vorhanden; sprich dieses Verhalten ist normal auch wenn du einen Datensatz verwirfst.
Um dem zu entgehen, müsstest du beim Verwerfen eines Datensatzes die DB (im Falle von Access z.B.) diese komprimieren.
Dann wird der Autoincrement-Wert auf den kleinsten Wert neu gesetzt.
Also bin zwar kein Pro aber ich leere meine Listview immer so:
for (int a = Listview1.Items.Count - 1; a >= 0; a--)
{
Listview1.Items.RemoveAt(a);
}
Listview1.Refresh();
Sollte, stimmt schon, nur das hier ist wohl anders ?!?
Der 0-Index ist nicht zu gebrauchen..
Was die Schleife angeht:
MailItem hat ein bestimmten Index, deswegen MUSS man von hintne anfangen, denn nach dem ersten .Move ist das zweite Item dann das erste..usw..
{
Outlook.Application o = new Outlook.Application();
Outlook._NameSpace ns = (Outlook._NameSpace)o.GetNamespace("MAPI");
Outlook.MAPIFolder f = ns.Folders[mailName].Folders["Posteingang"]; //funktioniert
Outlook.MAPIFolder subFolder = f.Folders["Sicherung"];
Outlook.MailItem item = null;
try
{
for (int i = f.Items.Count; i >=1; i--) //alle Mails durchgehen
{
item = (Outlook.MailItem)f.Items[i];
if (item.Attachments.Count > 0 && item.Subject.Contains("FAXG3") )//Anhang vorhanden??
{
item.Attachments[1].SaveAsFile(ZielPfad + i.ToString() + "_" + item.Attachments[1].FileName);
item.UnRead = false;
item.Move(subFolder);
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
So sieht das jetzt aus und funzt..
Hallo T-Virus,
danke für die Antwort.
Ja mit der If haste vollkommen recht, ist mir nicht mal aufgefallen 😃
Ich fange in der Schleife mit 1 an, weil 0 nicht funktioniert. Da kommt immer ne exception..(Array außerhalb gültiger Bereich)
Ebenso ist es mit den Anhängen - alle haben definitiv nur einen Anhang.
In dieses spezielle Postfach kommen nur derlei Mails.
Wie gesagt: der Code funzt eigentlich, nur macht er eben nicht alle mails auf einmal, sondern muss den Button mehrmals klicken bis er durch ist..
EDIT: jeder klick auf den Button arbeitet knapp die Hälfte aller vorhandenen Mails ab ?!?
f.Items.Count stimmt mit den vorhandenen Mails überein.
EDIT: omfg
so wird ien Schuh draus:
...
for (int i = f.Items.Count; i >= 1; i--)
...
Der "resettet" in obigen Code ja den Index nach dem Move, deswegen immer die Hälfte..
Hallo,
ich möchte Anhänge aus dem zweiten Postfach in Outlook speichern, Mails verschieben und nutze folgenden Code:
{
Outlook.Application o = new Outlook.Application();
Outlook._NameSpace ns = (Outlook._NameSpace)o.GetNamespace("MAPI");
Outlook.MAPIFolder f = ns.Folders["xxxxx@yyy.de"].Folders["Posteingang"];
Outlook.MAPIFolder subFolder = f.Folders["Sicherung"];
Outlook.MailItem item = null;
if (f.Items.Count > 0) //Mails vorhanden??
{
for (int i = 1; i <= f.Items.Count; i++) //alle Mails durchgehen
{
item = (Outlook.MailItem)f.Items[i];
if (item.Attachments.Count > 0 && item.SenderName.Contains("FAXG3") )//Anhang vorhanden??
{
item.Attachments[1].SaveAsFile(@"\\server\daten\eingang\" + item.Attachments[1].FileName);
item.UnRead = false;
item.Move(subFolder);
}
}
}
}
Funktioniert so weit, jedoch geht er nicht alle Mails durch sondern immer nur eine willkürliche Anzahl.
Ich muss diese Funktion immer mehrfach aufrufen, bis alle mails abgearbeitet sind.
Hat jemand eine Idee??