Ian Mercer posted a similar solution as this on Phil Haack's blog:
foreach (var item in Model.Select((value, i) => new { i, value }))
{
var value = item.value;
var index = item.i;
}
This gets you the item (item.value
) and its index (item.i
) by using this overload of LINQ's Select
:
the second parameter of the function [inside Select] represents the index of the source element.
The new { i, value }
is creating a new anonymous object.
Heap allocations can be avoided by using ValueTuple
if you're using C# 7.0 or later:
foreach (var item in Model.Select((value, i) => ( value, i )))
{
var value = item.value;
var index = item.i;
}
You can also eliminate the item.
by using automatic destructuring:
<ol>
foreach ((MyType value, Int32 i) in Model.Select((value, i) => ( value, i )))
{
<li id="item_@i">@value</li>
}
</ol>
In answer to your question 2, this code will show the connections control panel:
Process.Start(@"\windows\ctlpnl.exe", "cplmain.cpl,19");
A lot of the built in settings applets are shown through ctlpnl.exe. I got the magic number from the list here, not sure if it'll help, because you still need to guide the user through the rest of the comms setup.
With respect to your question 1, I have used DMProcessConfigXML and also config manager setup cabs to configure the comms settings (admittedly from c++, but looking at the api it should be straightforward to p/invoke as Shane has suggested). It was a while ago so I don't have any examples to hand right now, but we definitely got it to make new network settings and switch those drop downs to select the new settings. I'll see if I can dig up an example of the XML later.
It seems there is no need for P/Invoke, ConfigurationManager.ProcessConfiguration is the managed wrapper in the Microsoft.WindowsMobile namespace that calls DMProcessConfigXML.
I'm still looking for the right xml to send to it, most likely some combination of CM_Networks, CM_Planner and maybe some others... details are all here but the documentation is a little tricky to work out what does what, and I can't remember as it was a long time ago :(
Ok, after a little experimenting (as I didn't find the xml) here is some xml that you can pass to ConfigurationManager.ProcessConfiguration that will change the two settings:
<wap-provisioningdoc>
<characteristic type="CM_ProxyEntries">
<characteristic type="HTTP-{ADB0B001-10B5-3F39-27C6-9742E785FCD4}">
<parm name="SrcId" value="{ADB0B001-10B5-3F39-27C6-9742E785FCD4}" options="My Work Network{18AD9FBD-F716-ACB6-FD8A-1965DB95B814}My ISP{ADB0B001-10B5-3F39-27C6-9742E785FCD4}Work{A1182988-0D73-439E-87AD-2A5B369F808B}Secure WAP Network{F28D1F74-72BE-4394-A4A7-4E296219390C}The WAP Network{7022E968-5A97-4051-BC1C-C578E2FBA5D9}The Internet{436EF144-B4FB-4863-A041-8F905A62C572}" />
<parm name="DestId" value="{436EF144-B4FB-4863-A041-8F905A62C572}" options="My Work Network{18AD9FBD-F716-ACB6-FD8A-1965DB95B814}My ISP{ADB0B001-10B5-3F39-27C6-9742E785FCD4}Work{A1182988-0D73-439E-87AD-2A5B369F808B}Secure WAP Network{F28D1F74-72BE-4394-A4A7-4E296219390C}The WAP Network{7022E968-5A97-4051-BC1C-C578E2FBA5D9}The Internet{436EF144-B4FB-4863-A041-8F905A62C572}" />
<parm name="Proxy" value="new-inet:1159" />
<parm name="Override" value="" />
<parm name="Enable" value="1" />
<parm name="Type" value="0" />
<parm name="Username" value="" />
<parm name="Password" value="" />
<parm name="ExtraInfo" value="" />
</characteristic>
<characteristic type="null-corp-{ADB0B001-10B5-3F39-27C6-9742E785FCD4}">
<parm name="SrcId" value="{ADB0B001-10B5-3F39-27C6-9742E785FCD4}" options="My Work Network{18AD9FBD-F716-ACB6-FD8A-1965DB95B814}My ISP{ADB0B001-10B5-3F39-27C6-9742E785FCD4}Work{A1182988-0D73-439E-87AD-2A5B369F808B}Secure WAP Network{F28D1F74-72BE-4394-A4A7-4E296219390C}The WAP Network{7022E968-5A97-4051-BC1C-C578E2FBA5D9}The Internet{436EF144-B4FB-4863-A041-8F905A62C572}" />
<parm name="DestId" value="{A1182988-0D73-439E-87AD-2A5B369F808B}" options="My Work Network{18AD9FBD-F716-ACB6-FD8A-1965DB95B814}My ISP{ADB0B001-10B5-3F39-27C6-9742E785FCD4}Work{A1182988-0D73-439E-87AD-2A5B369F808B}Secure WAP Network{F28D1F74-72BE-4394-A4A7-4E296219390C}The WAP Network{7022E968-5A97-4051-BC1C-C578E2FBA5D9}The Internet{436EF144-B4FB-4863-A041-8F905A62C572}" />
<parm name="Proxy" value="" />
<parm name="Override" value="" />
<parm name="Enable" value="1" />
<parm name="Type" value="0" />
<parm name="Username" value="" />
<parm name="Password" value="" />
<parm name="ExtraInfo" value="" />
</characteristic>
</characteristic>
</wap-provisioningdoc>
This was taken from my wm 6 pro emulator, so you may need to play with the settings a little. It sets both the dropdowns to My ISP (the ADB0B001-10B5-3F39-27C6-9742E785FCD4 guid) Just change the guid in the type="HTTP-xxxx" and type="null-corp-xxxx" and ensure it matches in the srcId parm too.
I called ProcessConfiguration with this xml (and metadata set to true) to get a list of all the entries that were configured, it returns them in an xml doc.
<wap-provisioningdoc>
<characteristic-query type="CM_Mappings" recursive="true"/>
<characteristic-query type="CM_Planner" recursive="true"/>
<characteristic-query type="CM_Networks" recursive="true"/>
<characteristic-query type="CM_ProxyEntries" recursive="true"/>
<characteristic-query type="Wi-Fi" recursive="true"/>
<characteristic-query type="CM_PPPEntries" recursive="true"/>
<characteristic-query type="CM_VPNEntries" recursive="true"/>
<characteristic-query type="CM_NetEntries" recursive="true"/>
<characteristic-query type="CM_GPRSEntries" recursive="true"/>
</wap-provisioningdoc>
You can either use that to see what the guids and settings are or look in the include files from the WM sdk as they are listed there for use with the connection manager apis.
One caveat is that I haven't tried to use these connections after messing with them, but the UI does change when you process the configs
Best Answer
This is not the best answer, and I hope someone has a better one, but: one thing you can do when your app is not able to reach the webservice is to use the Process class (in System.Diagnostics) to start your webservice URL in Internet Explorer (aka "shelling out").
This will cause IE to appear, and since it can't see the webservice either, it will show the Settings dialog that you need. Once you change your settings so that you can see the webservice, you just close IE and now you're back in your app (which will now be able to see the webservice).