This was pissing me off for a good hour: RowDataBound event after you call edit on a row, I was checking for this row's state like this:
e.Row.RowState ==
DataControlRowState.Edit
this worked fine with rows No 1, 3, 5... (non-alternating rows), however with alternating rows of same GridView it did NOT work as their RowState is something like "Alternate | Edit". RowState contains more than one value using bit-logic. See DataControlRowState Enumeration
the solution is as follows:
((e.Row.RowState &
DataControlRowState.Edit) > 0)
Guess how? No image involved, pure html!
in MyControl:
public delegate void MyEventHandler(int value, string text);
public event MyEventHandler MyEvent;
protected void ddl_SelectedIndexChanged(object sender, EventArgs e)
{
MyEvent(((DropDownList)sender).SelectedIndex, ((DropDownList)sender).SelectedItem.Text);
}
in Parent:
this.MyControl.MyEvent += new AAL.FreedomWeb.Web.UI.UserControls.AircraftConfig.MyEventHandler(MyControl_MyEvent);
private void MyControl_MyEvent(int value, string text)
{
throw new NotImplementedException();
}
How do you convert a string into an enumeration?
object Enum.Parse(System.Type enumType, string value, bool ignoreCase);
example:
enum Colour
{
Red,
Green,
Blue
}
Colour c = (Colour) Enum.Parse(typeof(Colour), "Red", true);
Console.WriteLine("Colour Value: {0}", c.ToString());
source: http://blogs.msdn.com/tims/archive/2004/04/02/106310.aspx
..and we need to access it:
ScriptManager ScriptManager1 = (ScriptManager)Master.FindControl("ScriptManager1");
ScriptManager1.AsyncPostBackTimeout = 300;
..or a much beter way:
ScriptManager ScriptManager1 = ScriptManager.GetCurrent(this);
suggested by rajbk
Not sure if this is the best method, but this is the one I used to preload the image.
<script type="text/javascript">
if (document.images)
{
imgPreload = new Image();
imgPreload.src = "../Images/ajax-loader.gif";
}
</script>
I believe this method is available in .NET 3.5, but in earlier framework versions we have to implement this ourselves..
#region Helper functions
/// <summary>
/// Sorts the list box in descending order
/// </summary>
/// <param name="pList">the list to sort</param>
/// <param name="pByValue">Sort the list by values or text</param>
private void sortListBox(ref ListBox pList, bool pByValue)
{
SortedList lListItems = new SortedList();
//add listbox items to SortedList
foreach (ListItem lItem in pList.Items)
{
if (pByValue) lListItems.Add(lItem.Value, lItem);
else lListItems.Add(lItem.Text, lItem);
}
//clear list box
pList.Items.Clear();
//add sorted items to listbox
for (int i = 0; i < lListItems.Count; i++)
{
pList.Items.Add((ListItem)lListItems[lListItems.GetKey(i)]);
}
}
#endregion
}
/// <summary>
/// Take a file path and return a TextReader
/// </summary>
/// <param name="file_path"></param>
/// <returns></returns>
private TextReader OpenFile (string file_path)
{
try
{
// Read the CSV file in to a TextReader
TextReader _rdr = File.OpenText(file_path);
// Set file attributes
File.SetAttributes(file_path, FileAttributes.Normal);
return _rdr;
}
catch (Exception)
{
throw new Exception(String.Format(
"Error trying to open file {0}. Check file exists and is accessible<br /><br />" +
"Possible Issues:<br/><br />Files cannot be accessed via mapped network drives" +
"<br />The file is open<br />The file has been viewed and then saved in Excel",file_path));
}
}
First of all I'd like to thank kowalskec for pointing me out the CopySourceasHTML VS add-in that will help me copy the code snippets from Visual Studio here without losing any text formatting.
Cheers buddy! =)
And now the task:
- The BugsGridView GridView control and BugsListTimeLabel Label in the Default.aspx page are encapsulated inside an UpdatePanel with an ID of BugsListUpdatePanel. The UpdatePanel does not update when other UpdatePanels on the page generate postbacks.
- The ActivityLabel Label control in the Default.aspx page is encapsulated inside an UpdatePanel with an ID of ActivityUpdatePanel. The UpdatePanel does not update when other UpdatePanels on the page generate postbacks. This UpdatePanel does not contain any other controls.
- The ActivityUpdatePanel UpdatePanel control in the Default.aspx page defines a trigger which causes the UpdatePanel to asynchronously refresh when the Click event of the ClearButton Button is raised.
- The BugsGridView_RowUpdated event handler in the _Default partial class refreshes the ActivityUpdatePanel UpdatePanel if changes have been made to the BugsGridView GridView control.
This will help me remember how to make the UpdatePanel do a postback by clicking a button outside of the panel, as well as call the UpdatePanel Update() method from code behind.
<!--
Done:
The Default.aspx page contains a ScriptManager control with an ID of
BugsPageScriptManager.
-->
<asp:ScriptManager ID="BugsPageScriptManager" runat="server" EnablePartialRendering="true" />
<!--
Done:
The BugsGridView GridView control and BugsListTimeLabel Label in the
Default.aspx page are encapsulated inside an UpdatePanel with an ID of
BugsListUpdatePanel. The UpdatePanel does not update when other
UpdatePanels on the page generate postbacks.
-->
<asp:UpdatePanel ID="BugsListUpdatePanel" runat="server" UpdateMode="Conditional">
<ContentTemplate>
Bugs as of:
<asp:Label ID="BugsListTimeLabel" runat="server" Text="" />
<asp:GridView ID="BugsGridView" runat="server" AutoGenerateColumns="False" AutoGenerateEditButton="True"
DataSourceID="BugsDataSource" OnRowUpdated="BugsGridView_RowUpdated">
<
Columns>...</Columns>
</asp:GridView>
</ContentTemplate>
</asp:UpdatePanel><!--
Done:
The ActivityLabel Label control in the Default.aspx page is encapsulated
inside an UpdatePanel with an ID of ActivityUpdatePanel. The UpdatePanel
does not update when other UpdatePanels on the page generate postbacks.
This UpdatePanel does not contain any other controls.
-->
<!--
Done:
The ActivityUpdatePanel UpdatePanel control in the Default.aspx page
defines a trigger which causes the UpdatePanel to asynchronously refresh
when the Click event of the ClearButton Button is raised.
-->
<asp:UpdatePanel ID="ActivityUpdatePanel" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<asp:Label ID="ActivityLabel" runat="server" />
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="ClearButton" EventName="Click" />
</Triggers>
</asp:UpdatePanel>
<asp:Button ID="ClearButton" runat="server" Text="Clear"
OnClick="ClearButton_Click" />
protected void BugsGridView_RowUpdated(object sender, GridViewUpdatedEventArgs e)
{
if (CheckForChanges(e, "Description", "Status", "AssignedTo"))
{
// Done:
// The BugsGridView_RowUpdated event handler in the _Default partial class
// refreshes the ActivityUpdatePanel UpdatePanel if changes have been made
// to the BugsGridView GridView control.
ActivityUpdatePanel.Update();
}
}
First of all, I am not even talking about FireFox or Opera, it's IE6 what I try to use to make a new post. I copy-paste the code from Visual Studion or even do it through Word, but there's no way I can get the same look of code snippets:
This is copied straight from VS:
/// <summary>
/// Initialises webpage.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>protected void Page_Load(object sender, System.EventArgs e)
{
...
{
}
else
{
...
}
}
And this - VS -> Word -> Here:
/// <summary> /// Initialises webpage. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void Page_Load(object sender, System.EventArgs e) { DateTime theDate = DateTime.Parse("1 January 2007"); if( !IsPostBack ) {… } else { … }
}
The 1st is too much spacing between lines, 2nd looks OK even when I do a Preview here, I do get what I see, but, once I post it, it would wrap everything horribly, so in fact What You See Is Not What You Get (WYSINWYG)
=(
More Posts