ASP.Net add image to radiobuttonlist items on load - asp.net

I have a RadioButtonList that is bound to a datatable. Within the datatable, a column exist with urls of images and another column with the description.
The following is what I am doing right now (not working though):
foreach ( acryliccolor scurrent in ssmacryliccolor )
{
DataRow dr = dt.NewRow();
dr["TEXT"] = "<img src=\"\\colorswatches\\" + scurrent.SwatchURL + "\" alt=\"\" border=\"0\" /><span style=\"margin-right:21px;\"></span>" + scurrent.Color;
dr["VALUE"] = "ID|SC_" + scurrent.ID.ToString() + ";CSID|" + current.ID.ToString() + ";JS|radiosimple(this)";
dt.Rows.Add(dr);
}
this.rblAcrylicColors.DataSource = dt;
this.rblAcrylicColors.DataTextField = "TEXT";
this.rblAcrylicColors.DataValueField = "VALUE";
this.rblAcrylicColors.DataBind();
How do I add the image next to the description for each radiobutton item?

Have you tried dynamically adding items to the radiobuttonlist.Items collection?
this.rblAcrylicColors.Items.Add(String.Format("<img src={0} />", "url"));
Also have you checked the html output from what you are currently trying? Is the img tag there?

Related

ASP.NET Pass multiple checkbox values into a SELECT query

I am working on displaying a students timetable based on possible Module choices. Each time a check box is selected I want to pass through the value selected "ModuleId" to use in a SELECT query to display the timetable for all modules selected. So if a user selects 3 check boxes the 'ModuleId' from each row selected will be passed into the SELECT query.
I don't know how to store each selected "ModuleId" and add it into my select query.
Below is how I retrieve the checked value:
<asp:TemplateField>
<ItemStyle HorizontalAlign="Center" Width="40px"></ItemStyle>
<ItemTemplate>
<asp:CheckBox ID="chkRow" runat="server" ToolTip='<%# Eval("ModuleId") %>' OnCheckedChanged="module_Changed" />
</ItemTemplate>
<asp:TemplateField>
Below is my method to display the value in a label (just for testing purposes):
protected void module_Changed(object sender, EventArgs e)
{
// Retrieve the check box ModuleId value to add to my SELECT query
string moduleid = ((CheckBox)sender).ToolTip;
}
Below is my method which contains the select query to display the timetable:
public String[] getModulesAtCurrentSlot(int timeslotInt, String moduleID, String Day)
{
List<String> modulesList = new List<string>();
if (conn.State.ToString() == "Closed")
{
conn.Open();
}
SqlCommand newCmd = conn.CreateCommand();
newCmd.Connection = conn;
newCmd.CommandType = CommandType.Text;
newCmd.CommandText = "SELECT DISTINCT Module.ModuleCode,ClassType.ClassTypeName,Convert(time,Class.StartTime), Convert(time,Class.EndTime),Building.BuildingName,RoomCode.RoomCode,Class.Color" +
" FROM Class INNER JOIN Module ON Class.ModuleId = Module.ModuleId INNER JOIN RoomCode ON Class.RoomCodeId = RoomCode.RoomcodeId INNER JOIN Building ON RoomCode.BuildingId = Building.BuildingId INNER JOIN Days ON Class.DayId = Days.DayID INNER JOIN ClassType ON Class.ClassTypeId = ClassType.ClassTypeId WHERE " +
" Module.ModuleId = " + moduleID + " AND Convert(Date,StartTime) = '" + Day + "' AND " + timeslotInt.ToString() + " BETWEEN ClassScheduleStartTimeId and ClassScheduleEndTimeId";
SqlDataReader dr = newCmd.ExecuteReader();
while (dr.Read())
{
String current = "<div class='slot' " + (!dr.IsDBNull(6) ? "style=\"background-color: " + dr.GetString(6) + ";\"" : "") + ">";
current += "<div class='line1'>" + dr.GetString(0) + " " + dr.GetString(1) + "</div>";// +"<br />";
current += "<div class='line2'>" + dr.GetTimeSpan(2).ToString().TrimEnd('0').TrimEnd('0').TrimEnd(':') + " - " + dr.GetTimeSpan(3).ToString().TrimEnd('0').TrimEnd('0').TrimEnd(':') + "</div>";// +"<br />";
current += "<div class='line3'>" + dr.GetString(4) + " " + dr.GetString(5) + "</div>";
current += "</div>";
modulesList.Add(current);
}
conn.Close();
return modulesList.ToArray();
}
On a previous page where the timetable is only displaying data for one ModuleId I've used the below query string to pass through the value.
String module_ID = "2";
if (Request.QueryString["module"] != null)
{
module_ID = Request.QueryString["module"];
}
else
{
Response.Write("Missing ?module=XX from url :(");
Response.End();// EndRequest;
}
DBAccess.cs screenshot:
Error screenshot:
If I understand correctly, you could have a session variable that contains a List of strings which holds all of the selected moduleID's
You could then use module_Changed event to add or remove moduleIDs from this List and then call getModulesAtCurrentSlot in a loop for each moduleid in the list and concatenate the returned string[]s into one longer string[] or List which you then display.
there may be some errors in the code below as I'm just doing it from memory but it should give you an idea!
protected void module_Changed(object sender, EventArgs e)
{
List<string> lst;
if( Session["lst"]!=null)
lst = (List<string>)Session["lst"];
else
Session.Add("lst", new List<string>());
// Retrieve the check box ModuleId value to add to my SELECT query
string moduleid = ((CheckBox)sender).ToolTip;
// add your own code to check if checkbox is checked or unchecked to see if you need to add or remove the ID from the list
// to add
if(lst.Contains(moduleid) == false)
lst.Add(moduleid);
// to remove - add your own code
List<string> lstResult = new List<string>();
foreach(var moduleID in lst)
{
lstResult.Add(getModulesAtCurrentSlot(timeslotInt, moduleID, Day));
}
// do something to display lstResult
// e.g. drag a Gridview control on your aspx page and bind the results list to it - this is just to give you a rough idea but you'll need to play around with it to get it to work as you want, and hopefully learn something in the process ;)
Gridview1.DataSource = lstResult;
Gridview1.Databind();
}

ASP.NET Retrieve value from Checkbox onCheckChanged

I am working on displaying a students timetable based on possible Module choices. (See Screenshot) Currently I am displaying all available modules in a gridview which the student can select by using check boxes. I have already created the insert query to insert their selection to the database. (2)
However, each time a check box is selected I want to retrieve the 'ModuleId' to add to a SELECT query which displays a timetable of their selected modules. (1)
So if a user selects 3 check boxes the 'ModuleId' from each row selected will be passed into the SELECT query.
Below is my method which enables the timetable for specific a ModuleId to be displayed:
public String[] getModulesAtCurrentSlot(int timeslotInt, String moduleID, String Day)
{
List<String> modulesList = new List<string>();
if (conn.State.ToString() == "Closed")
{
conn.Open();
}
SqlCommand newCmd = conn.CreateCommand();
newCmd.Connection = conn;
newCmd.CommandType = CommandType.Text;
newCmd.CommandText = "SELECT DISTINCT Module.ModuleCode,ClassType.ClassTypeName,Convert(time,Class.StartTime), Convert(time,Class.EndTime),Building.BuildingName,RoomCode.RoomCode,Class.Color" +
" FROM Class INNER JOIN Module ON Class.ModuleId = Module.ModuleId INNER JOIN RoomCode ON Class.RoomCodeId = RoomCode.RoomcodeId INNER JOIN Building ON RoomCode.BuildingId = Building.BuildingId INNER JOIN Days ON Class.DayId = Days.DayID INNER JOIN ClassType ON Class.ClassTypeId = ClassType.ClassTypeId WHERE " +
" Module.ModuleId = " + moduleID + " AND Convert(Date,StartTime) = '" + Day + "' AND " + timeslotInt.ToString() + " BETWEEN ClassScheduleStartTimeId and ClassScheduleEndTimeId";
SqlDataReader dr = newCmd.ExecuteReader();
while (dr.Read())
{
String current = "<div class='slot' " + (!dr.IsDBNull(6) ? "style=\"background-color: " + dr.GetString(6) + ";\"" : "") + ">";
current += "<div class='line1'>" + dr.GetString(0) + " " + dr.GetString(1) + "</div>";// +"<br />";
current += "<div class='line2'>" + dr.GetTimeSpan(2).ToString().TrimEnd('0').TrimEnd('0').TrimEnd(':') + " - " + dr.GetTimeSpan(3).ToString().TrimEnd('0').TrimEnd('0').TrimEnd(':') + "</div>";// +"<br />";
current += "<div class='line3'>" + dr.GetString(4) + " " + dr.GetString(5) + "</div>";
current += "</div>";
modulesList.Add(current);
}
conn.Close();
return modulesList.ToArray();
}
How would I pass all selected values (ModuleId) from the checkboxes to be used in my above select query as previously for displaying just one module I used
' Module.ModuleId = " + moduleID ' ?
To complete what you are trying to do efficiently and without big foreach loops you need to change the whole way your user inputs data in to the gridview.
I believe that you should be utilising the GridViews OnRowUpdating Event, When a row is updated, using this event you already have context of which row has changed. e.RowIndex - Gets the index of the row being updated
Utilising this event will require a bit of a redesign of your gridview fields, You will need to add a EditItemTemplate tag in each TemplateField Add a CommandFieldand using OnRowUpdating re-write your update event. Its to much information to post in a answer, This information should help you get started on using the GridView events to their full potential.
On a side note you should use paramerterized queries in your sql.
EDIT
Based on your clarification that you need to retrieve the moduleid for each checkbox, I am going to make a few assumptions so it might not work without some tweaks.
To start with try this:
<asp:TemplateField>
<ItemStyle HorizontalAlign="Center" Width="40px"></ItemStyle>
<ItemTemplate>
<asp:CheckBox ID="chkRow" runat="server" ToolTip='<%# Eval("ModuleId") %>' OnCheckedChanged="module_Changed" />
</ItemTemplate>
Using '<%# Eval("ModuleId") %>' Will populate the tooltip for the checkbox with the ModuleID value during the GridView.DataBind() function. Iam making the assumption that the column name is exactly "ModuleId"
Then in the code behind you can read the tooltip value of the checkbox like this:
protected void module_Changed(object sender, EventArgs e)
{
// Retrieve the check box ModuleId value to add to SELECT query
string moduleid = ((CheckBox)sender).ToolTip;
}
Now that when the gridview loads all the checkboxes have a tooltip that is populated with the ModuleID you can easily know which box is for which module by checking the tooltip.

Blank Items in CheckBoxList (Remove blank items)

I have a rather irritating and silly problem. I have a checkbox list on a asp page that I populate from a database. I am able to populate it, the problem lies when I do a specific check that checks if the users are active or not, it displays only the ones that are active but then leaves huge blanks in my control of where the original not active users were displayed.
I have pictures of before and after I implement that specific if statement:
here is the code for populating and checking:
this.AddMultipleUsers.Items.Clear();
foreach (GetAllLoginUsersResult result in from a in this.db.GetAllLoginUsers(null)
orderby a.FirstName
select a)
{
ListItem item = new ListItem();
string str = Membership.GetUser(result.UserId).ToString();
item.Text = result.FirstName.Trim() + " " + result.Surname.Trim() + " (" + str + ")";
if (!result.IsApproved)
{
item.Text = item.Text + " (Not Active)";
//item.Attributes.Add("style", "display:none;"); before
}
item.Value = result.UserId.ToString();
this.AddMultipleUsers.Items.Add(item);
}
in the first image, the checkboxlist is fully populated. Before link to code^
in the second after I un-comment this line //item.Attributes.Add("style", "display:none;");
then checkboxlist is the same size as the first image but, there is large spaces between
the users that are active, when you scroll down you see them randomly.
I want to remove the blank items within the checkbox list and make the other valid entries to be moved up like a normally populated checkbox list
Thank you
simply add a where condition to your select statement:
this.AddMultipleUsers.Items.Clear();
foreach (GetAllLoginUsersResult result in from a in this.db.GetAllLoginUsers(null)
orderby a.FirstName
where a.IsApproved==true
select a)
{
ListItem item = new ListItem();
string str = Membership.GetUser(result.UserId).ToString();
item.Text = result.FirstName.Trim() + " " + result.Surname.Trim() + " (" + str + ")";
item.Value = result.UserId.ToString();
this.AddMultipleUsers.Items.Add(item);
}
now you are only cycling through the active users, and no longer need to hide the inactive ones.

Put the html tags in the title property of the image tag (Text formatting in the image tag)

using (SqlConnection conn = DataAccess.GetConnected())
{
SqlCommand cmd = new SqlCommand("GetImageForSlider", conn);
cmd.CommandType = CommandType.StoredProcedure;
SqlDataReader sqr = cmd.ExecuteReader();
while (sqr.Read())
{
string image_path = sqr.GetString(0);
string description = sqr.GetString(1);
string action = sqr.GetString(2);
HtmlImage += "<img src=\"" + image_path + "\" title=\"" + "<h3>" + description + action + "\".</h3><p><br></p><ahref=http://www.giftotravels.com >Thisislink</a>" + "/>";
}
}
i am trying to as above but this is not working properly
any one can help???
You cannot insert html tags inside image tag; it becomes invalid format. You want to render html like this.
HtmlImage += string.Format("<img src=\"{0}\" title=\"/><h3>{1}{2}.</h3>" +
"<p><br></p><a href='http://www.giftotravels.com'>Thisislink</a>",
image_path, description, action);
You can't. The title attribute gets rendered as plain text. If you want to do text markup, create an element yourself and let that float above the picture on mouseover.

Create Image and PlaceHolder from code behind - dynamic

I want read images from my database but they have to be inside of unorderd list.
I have an Handler do get the source of imgUrl
s+= "< ul>";
while (reader.Read())
{
id = reader.GetInt32(0);
s += "< li>< div>";
s += "< a href='#'>< img src='~/Handlers/ShowImage.ashx?id=" + id + "'/>< /a>";
s += "</ div></ li>";
}
s+="< /ul>";
after that I use a Literal who is declared in aspx to pass this block of html code.
myLiteral.text = s;
The problem is: my handler never is executed, so i never get the img source.
To solve that I start to use an PlaceHolder instead write the tag "< img ... />".
So i have:
while (reader.Read())
{
id = reader.GetInt32(0);
PlaceHolder holder = new PlaceHolder();
Image img = new Image();
img.ImageUrl = "~/Handlers/ShowImage.ashx?id=" + id;
holder.Controls.Add(img);
s += " li div";
s += " a href='" + reader.GetString(1) + "'" + holder + " /a";
s += " /div /li";
}
this way the handler executes but my holder just pass the .toString() :S
Someone help-me? And, is this the best way for what I want?
Thanks.
Please try....
StringWriter sw = new StringWriter();
HtmlTextWriter htw = new HtmlTextWriter(sw);
holder.RenderControl(htw);
string s = sw.ToString();
"s" is what you want.
Can you please clarify your question a bit?
When you say you have a handler... is that an HttpHandler?
Where is your code running? Is it on the codebehind of your page? What method is it?
Also, if you want to render the HTML strings yourself, it's recommended that you use the StringBuilder class instead of just "s+="
Thanks!

Resources