Issue with oncheckchanged in vb.net - webforms

I have a page with many gridviews. They are in 2 columns 5 on the left and 5 on the right. They are exactly the same.
The Gridview for Employment has a template for a checkbox on the far left. When this is checked, it fires the following:
Protected Sub ChckedChanged(ByVal sender As Object, ByVal e As EventArgs)
Dim row As GridViewRow = TryCast((CType(sender, Control)).Parent.NamingContainer, GridViewRow)
Dim key As String = GridView5.DataKeys(row.RowIndex).Value.ToString()
Dim Incomeadapter As New DataSet1TableAdapters.IncomeTableAdapter
Dim tblincome As New DataSet1.IncomeDataTable
tblincome = Incomeadapter.GetData(key)
GridView6.DataSource = tblincome
GridView6.DataBind()
Exit Sub
I have debugged this, and this code for some reason I don't understand is LOOPING around! Why does it does this? The first time around it gets the correct info, but then it goes back around and ruins the binding of the gridview to the tableadapter because the wrong ID was put into the call to the tableadapter funcion. Is it possible that OncheckChanged event does not work well with the onclick event? I'm using javascript to make sure that only 1 checkbox can be selected on the gridview on the same checkbox :
<div style="overflow-x: scroll; overflow-y: scroll; height: 100px; width: 444px">
<asp:GridView ID="GridView5" runat="server" DataSourceID="SqlDataSource5" AutoGenerateColumns="False" CellPadding="2" HorizontalAlign="Center" OnRowDataBound="Gridview5_rowdatabound" DataKeyNames="EmpID" RowStyle-Wrap="False" HeaderStyle-Wrap="False" ShowHeader="False" ShowFooter="True" FooterStyle-BackColor="Black">
<FooterStyle BackColor="Black"></FooterStyle>
<HeaderStyle Wrap="False"></HeaderStyle>
<RowStyle HorizontalAlign="Center" />
<Columns>
<asp:TemplateField ItemStyle-Width="25px" HeaderText="">
<ItemTemplate>
<asp:CheckBox ID="ChkSelect" runat="server" onclick="CheckOne(this)" AutoPostBack="True" OnCheckedChanged="ChckedChanged" />
</ItemTemplate>
</asp:TemplateField>
<script type="text/javascript">
function CheckOne(obj) {
var grid = obj.parentNode.parentNode.parentNode;
var inputs = grid.getElementsByTagName("input");
for (var i = 0; i < inputs.length; i++) {
if (inputs[i].type == "checkbox") {
if (obj.checked && inputs[i] != obj && inputs[i].checked) {
inputs[i].checked = false;
}
}
}
}
</script>
Rather than doing a postback, with this checkbox with autopostback set to true, is there a way to bind the income gridview which is below the employment gridview without a postback? The income gridview has a separate sql table which has the ID of the employer table as a column. The idea is when you check a checkbox on gridview5 (employment) the income gridview below changes to show the income items which are reflected of the employer. There can be multiple types of income for each employer. Any advice greatly appreciated.
' CausesValidation="False" />
' />
I was able to fix the "looping" issue by rewriting the code as follows:
Dim key As String = ""
For Each row As GridViewRow In GridView5.Rows
If row.RowType = DataControlRowType.DataRow Then
Dim chkrow As CheckBox = TryCast(row.Cells(0).FindControl("ChkSelect"), CheckBox)
If chkrow.Checked Then
key = GridView5.DataKeys(row.RowIndex).Value.ToString()
End If
End If
Next
'Dim row As GridViewRow = TryCast((CType(sender, Control)).Parent.NamingContainer, GridViewRow)
Dim Incomeadapter As New DataSet1TableAdapters.IncomeTableAdapter
Dim tblincome As New DataSet1.IncomeDataTable
tblincome = Incomeadapter.GetData(key)
GridView6.DataSource = tblincome
GridView6.DataBind()
It is working correctly, however on every postback the page goes up to the top and this is just not acceptable, so I would like to try it with Ajax and update panels. I'm reading up on this now.

Related

Telerik RadGrid EditTemplateColumn no value in textbox

I have a RadGrid and two columns. One Databound holding existing password and one EditTemplateColumn with a password confirmation textbox.
Since I want compare/validate the passwords I need to find the controls and the values.
The problem is that I can find the controls in the Radgrid ItemDataBound event, but not the inputed value for the confirm password textbox.
<telerik:GridBoundColumn DataField="Password" HeaderText="Password" UniqueName="Password" HeaderStyle-Width="130px" >
<ColumnValidationSettings EnableRequiredFieldValidation="true" EnableModelErrorMessageValidation="true">
<RequiredFieldValidator ForeColor="Red" ErrorMessage="Password is missing"></RequiredFieldValidator>
<ModelErrorMessage BackColor="Red" />
</ColumnValidationSettings>
</telerik:GridBoundColumn>
<telerik:GridTemplateColumn UniqueName="PasswordConfirm" HeaderText="Confirm password" Display ="false" >
<EditItemTemplate>
<Telerik:RadTextBox ID="textBoxPasswordConfirm" Runat="server" >
</Telerik:RadTextBox>
<asp:RequiredFieldValidator runat="server" ControlToValidate="textBoxPasswordConfirm"
ForeColor="Red" ErrorMessage="Password missing" >
</asp:RequiredFieldValidator>
</EditItemTemplate>
</telerik:GridTemplateColumn>
Here is the corresponding code:
GridEditableItem item = e.Item as GridEditableItem;
TextBox pwd1 = (TextBox)item["Password"].Controls[0];
RadTextBox pwdconfirm = (RadTextBox)item["PasswordConfirm"].FindControl("textBoxPasswordConfirm");
string t1 = pwd1.Text;
// the next line gives an empty string, and I do not understand why ????
string t2 = pwdconfirm.Text;
TableCell cell = (TableCell)pwd1.Parent;
CompareValidator val = new CompareValidator();
val.ControlToValidate = pwd1.ID;
val.ControlToCompare = pwdconfirm.ID;
val.Operator = ValidationCompareOperator.NotEqual;
val.ErrorMessage = "Passwords do not match";
val.ForeColor = Color.Red;
cell.Controls.Add(val);

Telerik Grid - Get master ID in details view

I have a master/detail grid where I do inserts on both the master and detail views. When I'm in detail mode, I need to obtain the master ID value but I can't seem to obtain the value.
I first obtain the inserteditem in the InsertCommand:
Dim inserteditem As GridDataInsertItem = DirectCast(e.Item, GridDataInsertItem)
And then I obtain an instance of the parent (master) view:
Dim parenttable As GridTableView = inserteditem.OwnerTableView.ParentItem.OwnerTableView
I just can't seem to get to the master key value, however. Anyone know what I should do?
Please try with the below code snippet.
.ASPX
<MasterTableView CommandItemDisplay="Top" DataKeyNames="ID" Name="parent">
<DetailTables>
<telerik:GridTableView Name="Child" DataKeyNames="Name">
</telerik:GridTableView>
</DetailTables>
<Columns>
........
........
</Columns>
</MasterTableView>
.ASPX.VB
Protected Sub RadGrid1_InsertCommand(sender As Object, e As GridCommandEventArgs)
If e.Item.OwnerTableView.Name = "Child" Then
Dim item As GridDataInsertItem = TryCast(e.Item, GridDataInsertItem)
Dim pitem As GridDataItem = TryCast(item.OwnerTableView.ParentItem, GridDataItem)
' Parent Item DataKey Here
Dim strID As String = pitem.GetDataKeyValue("ID").ToString()
End If
End Sub

Delete multiple row with radgrid

I am using Radgrid view with multi select row
I want to delete all selected records using checkbox in RadGrid
Code:
<telerik:RadGrid ID="RadGrid1" runat="server" AutoGenerateColumns="False"
OnNeedDataSource="RadGrid1_NeedDataSource"
AllowMultiRowSelection="true">
<MasterTableView DataKeyNames="ID">
<Columns>
<telerik:GridClientSelectColumn>
</telerik:GridClientSelectColumn>
<telerik:GridBoundColumn DataField="Name" UniqueName="Name" HeaderText="Name">
</telerik:GridBoundColumn>
<telerik:GridEditCommandColumn>
</telerik:GridEditCommandColumn>
</Columns>
</MasterTableView>
<ClientSettings>
<Selecting AllowRowSelect="true" />
</ClientSettings>
</telerik:RadGrid>
.aspx.vb
Protected Sub Button1_Click(sender As Object, e As EventArgs)
For Each item As GridDataItem In RadGrid1.SelectedItems
If item.Selected Then
'Access data key
Dim strID As String = item.GetDataKeyValue("ID").ToString()
End If
NEXT
End Sub
The problem is when I use this method to get selected rows IDs to delete records, it is retrieving only one record ID and deleting the record for which the ID is retrieved.
Example: I am selecting records 1,2,3,4 and clicking the delete button, it is deleting only the record with ID=4
I don't know vs Basic very well. But I can say that,
you are loose your current ID knowledge in this command
Dim strID As String = item.GetDataKeyValue("ID").ToString()
every iteration in foreach, your strId variable update with new item id.
Maybe you can use concat string methods (maybe
strId += item.id
to save your all selected ids.
Try below code:
protected void Button1_Click(object sender, EventArgs e)
{
string strID = string.Empty;
foreach( GridDataItem grditem in RadGrid.SelectedItems)
{
if (grditem.Selected)
{
strID = strID + "," + grditem.GetDataKeyValue("ID").ToString();
}
}
if (strID != string.Empty)
{
//your delete logic for db
// pass strID it will contain 1,2,3,4
}
}

unable to insert Telerik RadGrid In-Place insert using OnInsertCommand e.item

I am trying to perform an insert using teleriks rad grid. I am doing an in-place insert and using the onInsertCommand method to set the values that are to be insertted. i found this statement in telerik's documnetation:
GridEditableItem editedItem = e.Item as GridEditableItem; when i use it editedItem is getting null value and i dont know how to make it work:
Here is my code behind for InsertCommand
protected void RadGrid1_InsertCommand(Object Sender, Telerik.Web.UI.GridCommandEventArgs e)
{
GridEditableItem editedItem = e.Item as GridEditableItem;
Hashtable newValues = new Hashtable();
e.Item.OwnerTableView.ExtractValuesFromItem(newValues, editedItem);
editedItem.Edit = false;
Yieldco.RS.Libraries.BusinessObjects.UnitType u1 = new Yieldco.RS.Libraries.BusinessObjects.UnitType();
u1.Description = newValues["Description"].ToString();
u1.UnitTypeID = Convert.ToInt32(e.Item.OwnerTableView.DataKeyValues[editedItem.ItemIndex]["UnitTypeID"]);
u1.CommunityID = 1;
u1.CompanyID = 1;
u1.Bathrooms = (float)Convert.ToDouble(newValues["Bathrooms"]);
u1.Bedrooms = Convert.ToInt32(newValues["Bedrooms"]);
u1.SqFtHigh = (float)Convert.ToDouble(newValues["SqFtHigh"]);
u1.SqFtLow = (float)Convert.ToDouble(newValues["SqFtLow"]);
u1.NumOfUnits = Convert.ToInt32(newValues["NumOfUnits"]);
u1.ProCon = Convert.ToInt32(newValues["ProCon"]);
u1.OthCon = Convert.ToInt32(newValues["OthCon"]);
u1.RentHigh = (float)Convert.ToDouble(newValues["RentHigh"]);
u1.RentLow = (float)Convert.ToDouble(newValues["RentLow"]);
u1.Status = 1;
int id = MSController.SaveUnitTypes(u1);
}
and my aspx radgrid
AutoGenerateColumns="false" AllowAutomaticUpdates="false" AllowAutomaticInserts="false" DataKeyNames="UnitTypeID" GridLines="Both"
EditItemStyle-Width="24px">
<%--
--%>
' runat="server" ID="Addnew" Text="Add New" CommandName="InitInsert" />
' runat="server" ID="CancelAdd" Text="Cancel" CommandName="CancelAll" />
' runat="server" ID="InsertNew" Text="Perform Insert" CommandName="PerformInsert" />
' runat="server" ID="EditAll" Text="Edit All" CommandName="EditAll" />
0 %>' runat="server" ID="CancelEdit" Text="Cancel" CommandName="CancelAll" />
0 %>' runat="server" ID="UpdateAll" Text="Update All" CommandName="UpdateAll" OnClientClick='javascript:return confirm("Are you sure you want to Update All Records?")' />
<asp:ObjectDataSource ID="odsGetUnitTypes" runat="server"
TypeName="Yieldco.RS.Libraries.Controllers.MSController"
DataObjectTypeName="Yieldco.RS.Libraries.BusinessObjects.UnitType"
SelectMethod="GetUnitTypesByCommunityID"
InsertMethod="SaveUnitTypes"
UpdateMethod="SaveUnitTypes"
>
<SelectParameters>
<asp:Parameter DefaultValue="1" Name="CommunityID" />
</SelectParameters>
</asp:ObjectDataSource>
Please help me out to make a sucessful insertion.
Also in the Telerik documentation I saw them using e.ite.item index for getting the vdatakeyvalue but if I use it the index is always showing up as -1 so I used editedItem.ItemIndex and it works fine
Thanks in advance
To reference the insert item, you should use the following syntax (as opposed to edited item):
if(e.CommandName = RadGrid.PerformInsertCommandName)
{
GridEditableItem editItem = e.Item.OwnerTableView.GetInsertItem();
}

Clickable link in RadGrid column

I have a RadGrid where a column in the grid holds a URL. When a put a value in the column I can see the URL but the URL is not clickable (to go to the URL). How can I make the URL clickable?
Here is a rough example of what I'm doing now:
DataTable table = new DataTable();
DataRow row = table.Rows[0];
row["URL"] = "http://www.google.com";
grid.DataSource = table;
In addition I'd really like to show specific text instead of the URL. Something similar to Link in HTML. Is there anyway to do this?
Have you tried the GridHyperLinkColumn? Below is a detailed example.
<telerik:GridHyperLinkColumn FooterText="HyperLinkColumn footer" DataTextFormatString="Search Google for '{0}'" DataNavigateUrlFields="CompanyName" UniqueName="CompanyName" DataNavigateUrlFormatString="http://www.google.com/search?hl=en&q={0}&btnG=Google+Search" HeaderText="HyperLink<br/>Column" DataTextField="CompanyName"></telerik:GridHyperLinkColumn>
You can also view the demosite to see how it works.
http://demos.telerik.com/aspnet-ajax/grid/examples/generalfeatures/columntypes/defaultcs.aspx
Add all the columns manually in the ascx page and make the column you want to contain the hyperlink a GridTemplateColumn:
<telerik:GridTemplateColumn
UniqueName="TemplateLinkColumn"
AllowFiltering="false"
HeaderText="URL">
<ItemTemplate>
<asp:HyperLink ID="Link" runat="server"></asp:HyperLink>
</ItemTemplate>
</telerik:GridTemplateColumn>
Make sure that your grid has an OnItemDataBound method:
<telerik:RadGrid
ID="RadGrid"
runat="server"
AutoGenerateColumns="False"
OnItemDataBound="RadGrid_ItemDataBound" >
In your OnItemDataBound method set the field to the URL:
protected void RadGrid_ItemDataBound(object aSender, GridItemEventArgs anEventArgs)
{
//Get the row from the grid.
GridDataItem item = anEventArgs.Item as GridDataItem;
GridTableCell linkCell = (GridTableCell)item["TemplateLinkColumn"];
HyperLink reportLink = (HyperLink)reportLinkCell.FindControl("Link");
// Set the text to the quote number
reportLink.Text = "Google";
//Set the URL
reportLink.NavigateUrl = "http://www.google.com";
//Tell it to open in a new window
reportLink.Target = "_new";
}
You will also need to check for the correct type, as follows;
if (anEventArgs.Item.GetType().Name != "GridDataItem")
{
return;
}

Resources