How can I bind listbox with hashtable in ASP.net - html

I am belinda. I have tried the following cod to bind the hashtable with listbox.
.aspx:
<%# Page Language="VB" AutoEventWireup="false" CodeFile="Hashtable.aspx.vb" Inherits="Hashtable" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Button" />
<br />
<asp:ListBox ID="ListBox1" runat="server"></asp:ListBox><br />
</div>
</form>
</body>
</html>
.aspx.vb:
#Region "Namespaces"
Imports System.Data
Imports System.IO
Imports System.Net.Mail
#End Region
Partial Class Hashtable
Inherits System.Web.UI.Page
Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim ht As New Hashtable
ht.Items.Add("1", "Sunday")
ht.Items.Add("2", "Monday")
ht.Items.Add("3", "Tuesday")
ht.Items.Add("4", "Wednesday")
ht.Items.Add("5", "Thursday")
ht.Items.Add("6", "Friday")
ht.Items.Add("7", "Saturday")
ListBox1.DataSource = ht
ListBox1.DataValueField = "Key"
ListBox1.DataTextField = "Value"
ListBox1.DataBind()
End Sub
End Class
when executing i got the following error:
Data source is an invalid type. It must be either an IListSource, IEnumerable, or IDataSource.
why this coming... and What i should do... I dont want to use dictionary and all only the hashtable.
am using vb.net as a language not c#
Anyone please help me and Please clear my doubt .
Thanks in advance

Why not use a Dictionary instead of a hashtable? This is a even better solution as the values you add have an unique key (which is not the case in hashtables) and your values will be strongly typed:
#Region "Namespaces"
Imports System.Data
Imports System.IO
Imports System.Net.Mail
#End Region
Partial Class Hashtable
Inherits System.Web.UI.Page
Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim dictionary As New Dictionary(Of Integer, String)
dictionary.Add(1, "Sunday")
dictionary.Add(2, "Monday")
dictionary.Add(3, "Tuesday")
dictionary.Add(4, "Wednesday")
dictionary.Add(5, "Thursday")
dictionary.Add(6, "Friday")
dictionary.Add(7, "Saturday")
ListBox1.DataSource = dictionary
ListBox1.DataBind()
End Sub
End Class
Not all types of collections are supported by the DataSource property. While Hashtable is not supported, a Dictionary is.

Related

How to Create Hyperlink to Uploaded files to open the file

Hi Below is the code for Uploading Multiple files I cant display all the file names at a time it shows only one file name and how to create hyperlink to Uploaded documents to view the files.
Protected Sub Button1_Click(ByVal sender As Object, _
ByVal e As System.EventArgs)
If FileUpload1.HasFile Then
Try
FileUpload1.SaveAs("Destinationpath\testing\\" & _
FileUpload1.FileName)
Label1.Text = "File name: " & _
FileUpload1.FileName & "<br>"
ListBox1.Items.Add(System.IO.Path.GetFileName(FileUpload1.PostedFile.FileName))
Catch ex As Exception
Label1.Text = "ERROR: " & ex.Message.ToString()
End Try
Else
Label1.Text = "You have not specified a file."
End If
End Sub
Protected Sub Button2_Click(ByVal sender As Object, ByVal e As EventArgs)
'Files.RemoveAt(ListBox1.SelectedIndex)
ListBox1.Items.Remove(ListBox1.SelectedItem.Text)
Label1.Text = "File removed"
End Sub
and below is the aspx code
<div>
<asp:FileUpload ID="FileUpload1" runat="server" AllowMultiple="true"/><br />
<br />
<asp:Button ID="Button1" runat="server" OnClick="Button1_Click"
Text="Upload Document" /><br />
<br />
<asp:Label ID="Label1" runat="server"></asp:Label></div>
<asp:listbox ID="ListBox1" runat="server" Width="175px"></asp:listbox>
<asp:Button ID="Button2" runat="server" Text="Remove" Width="98px" OnClick="Button2_Click" />
can anyone help me to do this. Thanks..
Use ListBox for this. It will be something like:
protected void UploadButton_Click(object sender, EventArgs e){
foreach (HttpPostedFile fl in fu.PostedFiles)
{
fl.SaveAs(DestinationPath + fl.FileName);
ListItem li = new ListItem();
li.Text = fl.FileName;
ListBox1.Items.Add(li);
}
}
In your design page:
<asp:Panel ID="pnlFiles" runat="server" />
Your code behind:
Protected Sub Button1_Click(ByVal sender As Object, _ByVal e As System.EventArgs)
For Each fl as HttpPostedFile in fu.PostedFiles
Dim fileLink as String = DestinationPath + fl.FileName
fl.SaveAs(fileLink)
Dim hpr as New HyperLink
hpr.Text = "Download file"
hpr.NavigateUrl = fileLink
pnlFiles.Controls.Add(hpr)
Next
End Sub

how to add Button Click Event in asp.net with vb

I have problem with onclick event. Here is an example which is similar to my project
HTML
<%# Page Language="VB" AutoEventWireup="true" CodeFile="Example.aspx.vb" Inherits="Example" %>
<html>
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<asp:PlaceHolder ID="PlaceHolder1" runat="server"></asp:PlaceHolder>
<br />
<asp:Label ID="label1" runat="server" Text="Label"></asp:Label>
</form>
</body>
</html>
VB
Partial Class Example
Inherits System.Web.UI.Page
Dim No_of_Animals As Integer = 6 ' Number of Animals
Dim Cage(No_of_Animals) As String
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
label1.Text = " Animal released: " & Session.Item("AnimalReleased")
Cage(0) = "Cow"
Cage(1) = "Bat"
Cage(2) = "Dog"
Cage(3) = "Cat"
Cage(4) = "Snake"
Cage(5) = "Pig"
Dim html As New StringBuilder()
html.Append("<table>")
For Animal = 1 To No_of_Animals
html.Append("<tr><td>Cage " & Animal & " : </td>")
html.Append("<td> " & Cage(Animal - 1) & "</td>")
html.Append("<td><button runat=""server"" OnServerClick=""DisplayAnimal(" & Animal - 1 & ")"">Release</button></td></tr>")
Next
html.Append("</table>")
PlaceHolder1.Controls.Add(New Literal() With {.Text = html.ToString()})
End Sub
Public Sub DisplayAnimal(ByVal CageNo As Integer)
Session.Item("AnimalReleased") = Cage(CageNo)
End Sub
End Class
After I click a button the page will just refresh but session.item("AnimalRelease") was never given a value.
I'm suspecting onclick is not functioning well.
According to MSDN, the OnServerClick should be all lower case: "onserverclick".

Convert String into Div Object in vb.net/asp

I have a bit of a difficult problem which I can't seem to find out how to solve.
Basically, I have a couple tables on my database which, identify, by client, which divs IDs the client has access to, by using the tab
So I have a table which identifies the divs by their ID, by using the table index:
id | id_div
0 | D0
1 | D1
(and so on..)
And then another one which has only the clients ID and the divs (identified by the "id" field) he has access to:
client_id | div_id
29 | 0
29 | 1
(and so on..)
Then I'm cross referencing which divs should be visible and which should not.
The problem is I am getting the divs id as a string and in order to be able to tell in code-behind to set the visibility to false I need to reference the div in itself..
A sample:
<dx:TabPage Name="tabServico" Text="<%$ Resources:InterfaceGenerica, lblServico %>">
<ContentCollection>
<dx:ContentControl>
<div class="conteudo_pagina_tab">
<asp:HiddenField ID="hidID" runat="server" Value="0" EnableViewState="true" />
<asp:HiddenField ID="hidIdCliente" runat="server" Value="0" EnableViewState="true"/>
<div id="D0" runat="server">
<div class="cols coluna1">
<asp:Literal ID="litClientes" runat="server" Text="<%$ Resources:InterfaceGenerica, lblCliente %>"></asp:Literal>
</div>
<div class="cols coluna2-4">
<dx:ASPxComboBox ID="cboClientes" runat="server" HelpText="" ValueField="id_cliente" TextField="nome_completo" SelectedValue="" Width="100%" AutoPostBack="true"></dx:ASPxComboBox>
</div>
</div>
<clear></clear>
<div id="D1" runat="server">
<div class="cols coluna1">
<asp:Literal ID="litTipoOperacao" runat="server" Text="<%$ Resources:InterfaceGenerica, lblOperacao %>"></asp:Literal>
</div>
<div class="cols coluna2-4">
<dx:ASPxComboBox ID="cboTipoOperacao" runat="server" Width="100%" HelpText="" ValueField="id_operacoes" TextField="nome" SelectedValue="" AutoPostBack="true">
</dx:ASPxComboBox>
</div>
</div>
<clear></clear>
<div id="D2" runat="server">
<div class="cols coluna1">
<asp:Literal ID="litTipoServs" runat="server" Text="<%$ Resources:InterfaceGenerica, lblTipoServico %>"></asp:Literal>
</div>
<div class="cols coluna2-4">
<dx:ASPxComboBox ID="cboTipoServs" runat="server" HelpText="" ValueField="id_tipo_servs" TextField="nome" SelectedValue="" AutoPostBack="true" Width="100%"></dx:ASPxComboBox>
</div>
</div>
<div id="D3" runat="server">
<div class="cols coluna5">
<asp:Literal ID="litSubTipoServs" runat="server" Text="<%$ Resources:InterfaceGenerica, lblSubtipoServico %>"></asp:Literal>
</div>
<div class="cols coluna6-8">
<dx:ASPxComboBox ID="cboSubTipoServs" runat="server" HelpText="" ValueField="id_tipo_subtipos" TextField="nome" SelectedValue=""></dx:ASPxComboBox>
</div>
</div>
And in code behind I have:
Dim cross As New Hashtable()
Dim divsCliente() As String
Dim lstDivs As List(Of campos_agd_form)
lstDivs = campos_agd_form_mapper.CarregarDivs()
If lstDivs IsNot Nothing Then
For Each i In lstDivs
cross.Add(i.id, i.id_div)
Next
End If
Dim lstDivsCliente As List(Of clientes_campos_agd)
lstDivsCliente = clientes_campos_agd_mapper.CarregarCamposCliente(guser.id)
If lstDivsCliente IsNot Nothing Then
divsCliente = (lstDivsCliente.Item(0).id_campos_enum).Split(",")
End If
'Dim divsCliente() As Integer = Convert.ToInt32((lstDivsCliente.id_divs).Split(","))
For Each item In cross
For Each i In divsCliente
If item.Key = Convert.ToInt32(i) Then
Dim div As System.Web.UI.HtmlControls.HtmlGenericControl
div = TryCast(item.Value, System.Web.UI.HtmlControls.HtmlGenericControl)
div.Visible = False
End If
Next
Next
As I was already expecting I can't convert a string into a HtmlObject so what I need to do is to find an object by it's id (the string), without having to go through the parent-object (basically, search the whole document, like one would do with javascript with a getElementById)
How can this be accomplished?
The framework I'm using is .NET 4.0
I Recommend the following approach.
You need to know which information to show to each user, so you might want to store this in session for example (Global.asax):
Sub Session_Start(ByVal sender As Object, ByVal e As EventArgs)
' Fetch from DB
Session("Rights") = {"MyID1", "MyID3"}
End Sub
Then create a base user control that checks from the session if it's id is in the list of the rights the user has. If not, the control will automatically hide it self:
Imports System.Linq
Public MustInherit Class MyBaseControl
Inherits System.Web.UI.UserControl
Private Sub Page_Init(sender As Object, e As System.EventArgs) Handles Me.Init
If Page.IsPostBack Then Return
Dim rights As String() = CType(Session("Rights"), String())
If Not rights.Any((Function(s) s = Me.ID)) Then Me.Visible = False
End Sub
End Class
Then create x number of content controls that inherit from this base control. These controls can have totally different content, but consider making as few as possible, since your D0, D1 etc seem to have almost same content. So just customize the control to handle different texts and values:
Public Class MyControl1
Inherits MyBaseControl
End Class
Then on the page you will have as many of these controls as needed:
<div>
<uc1:MyControl1 ID="MyID1" runat="server" />
<uc2:MyControl2 ID="MyID2" runat="server" />
<uc3:MyControl3 ID="MyID3" runat="server" />
</div>
Hope this helps.
So, I ended up doing things a little differently.
Basically I'm using a ClientScriptManager, and constructing an array with the elements to hide. (Which is then passed to the client side).
So the function now looks like this:
Private Sub ManipulaFormCliente()
Dim cross As New Hashtable()
Dim divsCliente() As String = New String() {}
Dim aux() As String = New String() {}
Dim cs As ClientScriptManager = Page.ClientScript
Dim lstDivs As List(Of campos_agd_form)
lstDivs = campos_agd_form_mapper.CarregarDivs()
If lstDivs IsNot Nothing Then
For Each i In lstDivs
cross.Add(i.id, i.id_div)
Next
End If
Dim lstDivsCliente As List(Of clientes_campos_agd)
lstDivsCliente = clientes_campos_agd_mapper.CarregarCamposCliente(" id_cliente = " & Convert.ToInt32(hidIdCliente.Value))
If lstDivsCliente IsNot Nothing Then
If lstDivsCliente.Count <> 0 Then
divsCliente = (lstDivsCliente.Item(0).id_campos_enum).Split(",")
End If
End If
For Each item In cross
For Each i In divsCliente
If item.Key = Convert.ToInt32(i) Then
cs.RegisterArrayDeclaration("divsCliente", "'" & item.Value & "'")
End If
Next
Next
End Sub
Then, on the client side I made a function which runs once the window has loaded, and uses the array constructed on code-behind to apply a css "display: none" on the divs whose IDs get passed on the array.
The code is the following:
window.onload = function hideFields() {
if (divsCliente.length > 0) {
for (var i = 0; i < divsCliente.length; i++) {
document.getElementById(divsCliente[i]).style.display = 'none';
}
}
}
This implements the behaviour desired: Whenever there's a postback (and respective load) this function is run, hiding the required divs/fields.
As a final touch, I had to add the 'clientidmode = "static"' attribute to the divs, in order to get the getElementById() function to work properly (according to the data in the DB)
I hope this helps anyone in need of a similar solution.

How to write code in html for retrieving the session value.?

I have a Default2.cs file which stores a value in session
TextBox1.Text = "Haii";
Session["name"] = TextBox1.Text;
and i need to retrieve it in an html page- Default.aspx
<script runat="server">
Sub Page_Load
string na=(string)Session["name"];
Label1.Text=na;
End Sub
</script>
it shows an error 'String' is a class type and cannot be used as an expression.
please help
Try this in HTML in Defaul.aspx,
<% string na=(string)Session["name"]; %>
<label id="Label1"><% =na %></label>
For ASPX Engine:
Enclose your code in <% Your Code here %>
<% string na=(string)Session["name"]; %>
For Razor Engine:
Enclose your code in #{ Your Code here }
#{
string na=(string)Session["name"];
}

"Post" XML Data like HTML with Hidden Values using ContentType ="txt/html"

I want to do the same that works previously on HTML but now via .NET Windows Forms.
When I submit this HTML it works :
<html>
<head>
</head>
<body>
<form name="TestForm" action="http://staging.csatravelprotection.com/ws/policyrequest" method="POST">
<input type="hidden" name="xmlrequeststring" value="
<quoterequest>
<aff>COSTAMAR</aff> <!-- required -->
<producer>10527930</producer> <!-- optional -->
<productclass>85FL</productclass> <!-- required -->
<bookingreservno>0123456789AB</bookingreservno> <!-- optional -->
<numinsured>3</numinsured> <!-- required -->
<tripcost>5000.00</tripcost> <!-- required -->
<departdate>2010-11-01</departdate> <!-- required -->
<returndate>2010-11-20</returndate> <!-- required -->
<triptype>Cruise</triptype> <!-- optional -->
<destination>Europe/ Mediterranean</destination> <!-- required -->
<supplier>Carnival Cruise Lines</supplier> <!-- optional -->
<airline>American</airline> <!-- optional-->
<travelers>
<traveler>
<age>45</age> <!-- required -->
</traveler>
<traveler>
<age>43</age> <!-- required -->
</traveler>
<traveler>
<age>15</age> <!-- required -->
</traveler>
</travelers>
</quoterequest>
">
<input type="submit" name="submit" value="submit">
</form>
</body>
</html>
but when I try to send the XML via POST using .NET it appear to fail cause I dont know how to post via Hidden Input on the URI.
Imports System.IO
Imports System.Text
Imports System.Net
Public Class Form2
Private Shared URL As String = "http://staging.csatravelprotection.com/ws/policyrequest"
Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim oHttpWebRequest As WebRequest = WebRequest.Create(New Uri(URL))
oHttpWebRequest.Method = "POST"
oHttpWebRequest.ContentType = "text/xml"
Dim oStream As Stream = oHttpWebRequest.GetRequestStream()
Dim Reader As StreamReader = New StreamReader("C:\TEST.XML", Encoding.Default)
Dim Postdata As String = String.Format("xmlrequeststring={0}", Reader.ReadToEnd)
oStream.Write(Encoding.ASCII.GetBytes(Postdata), 0, Postdata.Length)
oStream.Close()
Dim oHttpWebResponse As HttpWebResponse = CType(oHttpWebRequest.GetResponse(), HttpWebResponse)
Dim oStreamResponse As Stream = oHttpWebResponse.GetResponseStream()
Dim oStreamRead As StreamReader = New StreamReader(oStreamResponse, Encoding.UTF8)
Dim strReturnedXML As String = oStreamRead.ReadToEnd()
MessageBox.Show(strReturnedXML)
oStreamResponse.Close()
oStreamRead.Close()
oHttpWebResponse.Close()
End Sub
End Class
XML :
<quoterequest>
<aff>COSTAMAR</aff>
<producer>10527930</producer>
<productclass>TBD</productclass>
<bookingreservno>0123456789AB</bookingreservno>
<numinsured>3</numinsured>
<tripcost>5000.00</tripcost>
<departdate>2009-11-01</departdate>
<returndate>2009-11-20</returndate>
<initdate>2008-09-30</initdate>
<finalpaymentdate>2008-10-30</finalpaymentdate>
<triptype>Cruise</triptype>
<destination>Europe/ Mediterranean</destination>
<supplier>Carnival Cruise Lines</supplier>
<airline>American</airline>
</quoterequest>
Is there a way to make it work as expected on .NET?
Thanks
It is possible, but you should not post only the xml data, but the original html file with your xml data embedded.
Het recieving page expects the data in that form. It cannot/does not see the difference between a browser or your program posting.
It could be that they have a different url form posting xml format data.
MarcelDevG
Thats impossible, but you can work with POST using ContentType ="txt/xml"