TODO:
I recently had an issue, where the RadAjaxLoadingPanel would only load on the first button click. This was frustrating, and like many things Telerik, there are 10 answers and 0.5 of them work. To fix this, I hooked into the button click event in JQuery, and then showed the loading panel manually from there.
SOLUTION:
<telerik:RadCodeBlock ID="rcbInitHandler"runat="server">
<script type="text/javascript">
//global variables
var currentLoadingPanel = null;
var currentUpdatedControl = null;
//add the init activity
Sys.Application.add_init(appl_init);
//Do this on init
function appl_init() {
var pgRegMgr = Sys.WebForms.PageRequestManager.getInstance();
pgRegMgr.add_endRequest(EndHandler);
pgRegMgr.add_beginRequest(BeginHandler);
}
//Called before async postback
function BeginHandler() {
document.body.style.cursor = 'wait';
}
//Called after async postback
function EndHandler() {
if (currentLoadingPanel != null && currentUpdatedControl != null)
currentLoadingPanel.hide(currentUpdatedControl);
currentUpdatedControl = null;
currentLoadingPanel = null;
document.body.style.cursor ='default';
}
//Show the loading panel
function ShowLoadingPanel() {
currentLoadingPanel = $find('<%=rdlpLoadingPanel.ClientID%>');
currentUpdatedControl ='<%=pnlSomePanel.ClientID%>';
currentLoadingPanel.show(currentUpdatedControl);
}
$(document).ready(function () {
//Register buttons so we get pop-up. we could have done all buttons, but we do not want to get the grid button
$('#<%=btnLoad.ClientID%>').live("click",function () {
ShowLoadingPanel();
});
});
</script>
</telerik:RadCodeBlock>
NOTES:
You will need a Loading Panel called rdlLoadingPanel, a panel called pnlSomePanel, and a button called btnLoad. The rest is pretty self explanatory.
TODO:
Have you ever wanted to catch the Sort Event of a Telerik RadGrid, and sort your datasource? This comes in handy if you are using the rows in the grid as a 1 to 1 map with items in the datasource. This saves you from needing to worry about working with the rows and columns of a grid, but instead you can work with the List of Objects, and simply ReBin().
SOLUTION:
protected voidrgdMyGrid_SortCommand(object source, Telerik.Web.UI.GridSortCommandEventArgs e)
{
//check the sort order. if it is descending, then we need to order list that way, otherwise use default of ascending.
Func<MyObject, string> orderByColumn =null;
//Figure out which sort column
switch (e.SortExpression)
{
case "FirstName":
orderByColumn = s => s.FirstName;
break;
case "LastName":
orderByColumn = s => s.LastName;
break;
case "Telephone":
orderByColumn = s => s.Telephone;
break;
}
//now check the sort order, and sort accordingly
if (e.NewSortOrder == GridSortOrder.Descending)
{
myDataSource = myDataSource.OrderByDescending(orderByColumn).ToList();
}
else
{
myDataSource = myDataSource.OrderBy(orderByColumn).ToList();
}
rgdMyGrid.DataSource = null;
rgdMyGrid.Rebind();
}
NOTES:
MyDataSource is a List<MyObject>. I was using the datasource for the grid and had to keep them in sync, because sorting the grid did not by default sort the datasource. You also need to sort the datasource on insert, update, and delete of an item in the RadGrid, if a sort column is selected.
TODO:
Your iPad is slow, you click on items and it just outlines them. If you double or triple click an item, it may select it or it may not.
SOLUTION:
You may have an iPad that is in Voice Over mode. In my case, I had the volume down the whole way, and was not familiar with what Voice Over looked like when activated. IF you triple click the home button, it should toggle the iPad out of Voice Over mode. That setting is controlled in the Settings area.
NOTES:
There are no notes on this topic
TODO:
Have you ever noticed a large amount of data in the 'Other' area in iTunes? It is yellow, and in my case was 3gb+
SOLUTION:
To fix, follow the instructions on this link
I have tried this solution and it worked perfectly!
NOTES:
There are no notes on this topic.
TODO:
Have you ever received the error "Cannot detach a suspect or recovery pending database. It must be repaired or dropped." when trying to detach a database that is suspect?
SOLUTION:
ALTER DATABASE MyDB SET EMERGENCY;
GO
ALTER DATABASE MyDB set single_user
GO
DBCC CHECKDB (MyDB, REPAIR_ALLOW_DATA_LOSS) WITH ALL_ERRORMSGS;
GO
ALTER DATABASE MyDB set multi_user
GO
NOTES:
Once that is done, you can then detach, and attach, or just bring online.
TODO:
You have a list of objects (List<T>), let's just say List<Dog> for this example. You want to sort them by a property called "Breed". This example will show you just how to do that.
SOLUTION:
List myDogList = myDogList.OrderBy(d => d.Breed).ToList();
//or
List myDogList = myDogList.OrderByDescending(d => d.Breed).ToList();
NOTES:
Your list of dogs will now be sorted by Breed.
*****Note that the default sort order is ascending.
TODO:
You impersonate a user in an event receiver, and the result of calling Update() on the list item means that the "Modified By" user is that of the impersonated account, and not the original user that was logged into the site. The solution is pretty simple, just use the code below to set that user back to the original user.
SOLUTION:
private void ApplyPermissions(SPItemEventProperties properties)
{
string debugMessage = string.Empty;
Guid webId = properties.ListItem.Web.ID;
Guid siteId = properties.SiteId;
SPUserToken sysToken = null;
SPUser currentUser = null;
try
{
currentUser = properties.Web.CurrentUser;
//open site, and get elevated user
using (SPSite site = new SPSite(siteId))
{
//use our site collection
using (SPWeb myWeb = site.OpenWeb(webId))
{
sysToken = myWeb.AllUsers["i:0#.w|mydomain\\impusr"].UserToken;
}
}
bool allowUnsafeUpdates = false;
//open site with elevated user
using (SPSite site = new SPSite(properties.SiteId, sysToken))
{
//get the web
using (SPWeb myWeb = site.OpenWeb(properties.ListItem.Web.ID))
{
try
{
allowUnsafeUpdates = myWeb.AllowUnsafeUpdates; //save unsafe update setting
myWeb.AllowUnsafeUpdates = true; //allow unsafe updates for now
SPListItem elevatedListItem = null;
elevatedListItem = myWeb.Lists[properties.ListId].Items[properties.ListItem.UniqueId]; //get elevated list item
//DO ELEVATED ACTIONS HERE
base.EventFiringEnabled = false;
elevatedListItem["Editor"] = currentUser; //set current user to editor and author
elevatedListItem["Author"] = currentUser;
elevatedListItem.Update(); //update the item
base.EventFiringEnabled = true;
}
catch (Exception x)
{
throw x;
}
finally
{
myWeb.AllowUnsafeUpdates = allowUnsafeUpdates; //put back original setting
}
}//using web
}//using site
}
catch (Exception x)
{
properties.ErrorMessage = x.ToString();
}
}
NOTES:
This code ran in an ItemAdded and ItemUpdated Event Receiver
TODO:
Recently I had a corrupt log file, and my database was continuously 'Suspect'. Since this was a test database, I did not care about my corrupt .ldf file. Therefore, I simply wanted to attach my .mdf file and let it create a new .ldf file. The SQL below will do just that.
SOLUTION:
CREATE DATABASE myDatabase ON
( FILENAME = N'G:\DATA\myDatabase.mdf')
FOR ATTACH
GO
NOTES:
This method works when there is only one log file and it is missing.
IF there is more than 1 log file, use 'FOR ATTACH_REBUILD_LOG' rather than 'FOR ATTACH'
TODO:
Have you ever wanted to get the selected value of a RadioButtonList using JQuery? You can do it via CssClass, but in this example, I want to target a particular control.
SOLUTION:
//handle nothing being checked
if ($("#<%= rblMyRadioList.ClientID %> input:checked").val() == null) {
return;
}
var selectedValue = $("#<%= rblMyRadioList.ClientID %> input:checked").val().toUpperCase();
NOTES:
There are no notes on this topic.
TODO:
Have you ever wanted to get badly fragmented indexes, and rebuild them using T-SQL?
SOLUTION:
CREATE procedure [dbo].[sp_GetIndexFragmentation]
AS
-- Declare variables
SET NOCOUNT ON;
DECLARE @tablename VARCHAR(128);
DECLARE @execstr VARCHAR(255);
DECLARE @objectid INT;
DECLARE @indexid INT;
DECLARE @frag decimal;
DECLARE @maxfrag decimal;
-- Decide on the maximum fragmentation to allow for.
SELECT @maxfrag = 30.0;
-- Declare a cursor.
DECLARE tables CURSOR FOR
SELECT CAST(TABLE_SCHEMA AS VARCHAR(100))
+'.'+CAST(TABLE_NAME AS VARCHAR(100))
AS Table_Name
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE';
-- Create the table.
CREATE TABLE #fraglist (
ObjectName CHAR(255),
ObjectId INT,
IndexName CHAR(255),
IndexId INT,
Lvl INT,
CountPages INT,
CountRows INT,
MinRecSize INT,
MaxRecSize INT,
AvgRecSize INT,
ForRecCount INT,
Extents INT,
ExtentSwitches INT,
AvgFreeBytes INT,
AvgPageDensity INT,
ScanDensity decimal,
BestCount INT,
ActualCount INT,
LogicalFrag decimal,
ExtentFrag decimal);
-- Open the cursor.
OPEN tables;
-- Loop through all the tables in the database.
FETCH NEXT
FROM tables
INTO @tablename;
WHILE @@FETCH_STATUS = 0
BEGIN;
-- Do the showcontig of all indexes of the table
INSERT INTO #fraglist
EXEC ('DBCC SHOWCONTIG (''' + @tablename + ''')
WITH FAST, TABLERESULTS, ALL_INDEXES, NO_INFOMSGS');
FETCH NEXT
FROM tables
INTO @tablename;
END;
-- Close and deallocate the cursor.
CLOSE tables;
DEALLOCATE tables;
-- Declare the cursor for the list of indexes to be defragged.
DECLARE indexes CURSOR FOR
SELECT ObjectName, ObjectId, IndexId, LogicalFrag
FROM #fraglist
WHERE LogicalFrag >= @maxfrag
AND INDEXPROPERTY (ObjectId, IndexName, 'IndexDepth') > 0;
-- Open the cursor.
OPEN indexes;
-- Loop through the indexes.
FETCH NEXT
FROM indexes
INTO @tablename, @objectid, @indexid, @frag;
WHILE @@FETCH_STATUS = 0
BEGIN;
PRINT 'Executing DBCC INDEXDEFRAG (0, ' + RTRIM(@tablename) + ',
' + RTRIM(@indexid) + ') - fragmentation currently '
+ RTRIM(CONVERT(VARCHAR(15),@frag)) + '%';
SELECT @execstr = 'DBCC INDEXDEFRAG (0, ' + RTRIM(@objectid) + ',
' + RTRIM(@indexid) + ')';
--UNCOMMENT LINE BELOW TO ACTUALLY DEFRAG
--EXEC (@execstr);
FETCH NEXT
FROM indexes
INTO @tablename, @objectid, @indexid, @frag;
END;
-- Close and deallocate the cursor.
CLOSE indexes;
DEALLOCATE indexes;
-- Delete the temporary table.
DROP TABLE #fraglist;
NOTES:
There are no notes on this topic