Telerik Forums
UI for ASP.NET AJAX Forum
1 answer
133 views
Hi,

Is it possible to enable/ disable particular row in radgrid server side?

While binding I am selecting some rows , and don't want user to deselect them (some of the rows).
How can I disable specific row?
Princy
Top achievements
Rank 2
 answered on 05 Mar 2010
2 answers
145 views
I have a RadGrid named gvConcurrence that has an Edit Template with button called btnUpdate.  When I click on the button It does not hit my OnInsertCommand="gvConcurrence_InsertCommand".  If I hit the btnUpdate again it then goes into my OnInsertCommand="gvConcurrence_InsertCommand".  Why is it skipping on my first hit of the btnUpdate?  Here is the template section with the button and below that is my full aspx and aspx.cs. Oh and by the way the Grid is in a user control but I don't believe that should be the reason why it does not fire on first hit.  Or maybe that's my answer.  Anyhow...here you go.
 
<EditFormSettings EditFormType="Template">   
    <FormTemplate>   
        <table id="Table2" cellspacing="2" cellpadding="1" border="0" rules="none"   
            style="border-collapse: collapse; background: white;">   
            <tr>   
                <td colspan="2" style="font-size: small">   
                    <b>Add Additional Concurrence</b>   
                </td>   
            </tr>   
            <tr>   
                <td>   
                    <asp:DropDownList ID="ddlConcur" runat="server">   
                        <asp:ListItem>Approve</asp:ListItem>   
                        <asp:ListItem>Disapprove</asp:ListItem>   
                        <asp:ListItem>Abstain</asp:ListItem>   
                    </asp:DropDownList>   
                </td>   
                <td valign="top">   
                    <telerik:RadTextBox Width="195px" ID="txtComments" runat="server" TextMode="MultiLine"   
                        Label="Comments: " EmptyMessage="Enter Comments Here" AutoPostBack="true" >   
                    </telerik:RadTextBox>   
                </td>   
            </tr>      
                                       
            <tr>   
                <td align="right" colspan="2">   
                    <asp:Button ID="btnUpdate" Text='<%# (Container is GridEditFormInsertItem) ? "Insert" : "Update" %>'   
                        runat="server" CommandName='<%# (Container is GridEditFormInsertItem) ? "PerformInsert" : "Update" %>'>   
                    </asp:Button>&nbsp;   
                    <asp:Button ID="btnCancel" Text="Cancel" runat="server" CausesValidation="False"   
                    CommandName="Cancel"></asp:Button></td>   
            </tr>   
        </table>   
    </FormTemplate>   
</EditFormSettings>   
 
Full aspx
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="Concurrence.ascx.cs" Inherits="AMC.OnlineSCR.Web.UserControls.Concurrence" %>   
<%@ Register assembly="Telerik.Web.UI" namespace="Telerik.Web.UI" tagprefix="telerik" %>   
<asp:LoginName ID="LoginName1" Visible="false" runat="server" />    
<telerik:RadGrid ID="gvConcurrence"    
    runat="server"    
    Width="96%"    
    GridLines="None"   
    AutoGenerateColumns="False"    
    PageSize="13"    
    AllowSorting="True"    
    AllowPaging="True"    
    OnNeedDataSource="gvConcurrence_NeedDataSource"   
    ShowStatusBar="true"    
    OnInsertCommand="gvConcurrence_InsertCommand"    
    OnDeleteCommand="gvConcurrence_DeleteCommand"   
    OnItemDataBound="gvConcurrence_ItemDataBound"   
    OnEditCommand="gvConcurrence_EditCommand">   
        <MasterTableView DataKeyNames="CONCURRENCE_ID"    
            AllowMultiColumnSorting="True"    
            Width="100%"   
            CommandItemDisplay="Top">   
        <Columns>   
            <telerik:GridButtonColumn UniqueName="DeleteColumn"    
                Text="Delete"    
                CommandName="Delete" />   
            <telerik:GridBoundColumn UniqueName="CONCURRENCE_ID"    
                SortExpression="CONCURRENCE_ID"    
                HeaderText="CONCURRENCE ID"   
                DataField="CONCURRENCE_ID"   
                Display="false"/>   
            <telerik:GridBoundColumn UniqueName="SCRID"    
                SortExpression="SCRID"    
                HeaderText="SCR ID"   
                DataField="SCRID"   
                Display="false" />   
            <telerik:GridBoundColumn UniqueName="CONCURRENCE"    
                SortExpression="CONCURRENCE"    
                HeaderText="Concurrence"   
                DataField="CONCURRENCE" />   
            <telerik:GridBoundColumn UniqueName="COMMENTS"    
                SortExpression="COMMENTS"    
                HeaderText="Comments"   
                DataField="COMMENTS" />   
            <telerik:GridBoundColumn UniqueName="USER_ID"    
                SortExpression="USER_ID"    
                HeaderText="User ID"   
                DataField="USER_ID"   
                Display="false" />   
            <telerik:GridBoundColumn UniqueName="USER_NAME"    
                SortExpression="USER_NAME"    
                HeaderText="User Name"   
                DataField="USER_NAME" />   
            <telerik:GridBoundColumn UniqueName="FIRST_NAME"    
                SortExpression="FIRST_NAME"    
                HeaderText="First Name"   
                DataField="FIRST_NAME" />   
            <telerik:GridBoundColumn UniqueName="LAST_NAME"    
                SortExpression="LAST_NAME"    
                HeaderText="Last Name"   
                DataField="LAST_NAME" />   
            <telerik:GridBoundColumn UniqueName="POSITION_TITLE"    
                SortExpression="POSITION_TITLE"    
                HeaderText="POSITION_TITLE"   
                DataField="POSITION_TITLE" />   
            <telerik:GridBoundColumn UniqueName="ADDRESS"    
                SortExpression="ADDRESS"    
                HeaderText="Address"   
                DataField="ADDRESS"    
                Display="false"/>   
            <telerik:GridBoundColumn UniqueName="CITY"    
                SortExpression="CITY"    
                HeaderText="City"   
                DataField="CITY"    
                Display="false"/>   
            <telerik:GridBoundColumn UniqueName="STATE"    
                SortExpression="STATE"    
                HeaderText="State"   
                DataField="STATE"    
                Display="false"/>   
            <telerik:GridBoundColumn UniqueName="ZIP"    
                SortExpression="ZIP"    
                HeaderText="Zip"   
                DataField="ZIP"    
                Display="false"/>   
            <telerik:GridBoundColumn UniqueName="PHONE"    
                SortExpression="PHONE"    
                HeaderText="Phone"   
                DataField="PHONE"    
                Display="false"/>   
            <telerik:GridBoundColumn UniqueName="EXTENSION"    
                SortExpression="EXTENSION"    
                HeaderText="Extension"   
                DataField="EXTENSION"    
                Display="false"/>   
            <telerik:GridBoundColumn UniqueName="BASE_ID"    
                SortExpression="BASE_ID"    
                HeaderText="Base ID"   
                DataField="BASE_ID"   
                Display="false"/>   
            <telerik:GridBoundColumn UniqueName="CODE"    
                SortExpression="CODE"    
                HeaderText="Base Code"   
                DataField="CODE"/>   
            <telerik:GridBoundColumn UniqueName="GEOLOC_NAME"    
                SortExpression="GEOLOC_NAME"    
                HeaderText="Geo Loc Name"   
                DataField="GEOLOC_NAME"    
                Display="false"/>   
            <telerik:GridBoundColumn UniqueName="COMMAND"    
                SortExpression="COMMAND"    
                HeaderText="Command"   
                DataField="COMMAND"    
                Display="false"/>   
            <telerik:GridBoundColumn UniqueName="UNIT_DEPARTMENT"    
                SortExpression="UNIT_DEPARTMENT"    
                HeaderText="Unit/Department"   
                DataField="UNIT_DEPARTMENT"    
                Display="false"/>   
            <telerik:GridBoundColumn UniqueName="EMAIL"    
                SortExpression="EMAIL"    
                HeaderText="Email"   
                DataField="EMAIL" />   
        </Columns>   
        <EditFormSettings EditFormType="Template">   
            <FormTemplate>   
                <table id="Table2" cellspacing="2" cellpadding="1" border="0" rules="none"   
                    style="border-collapse: collapse; background: white;">   
                    <tr>   
                        <td colspan="2" style="font-size: small">   
                            <b>Add Additional Concurrence</b>   
                        </td>   
                    </tr>   
                    <tr>   
                        <td>   
                            <asp:DropDownList ID="ddlConcur" runat="server">   
                                <asp:ListItem>Approve</asp:ListItem>   
                                <asp:ListItem>Disapprove</asp:ListItem>   
                                <asp:ListItem>Abstain</asp:ListItem>   
                            </asp:DropDownList>   
                        </td>   
                        <td valign="top">   
                            <telerik:RadTextBox Width="195px" ID="txtComments" runat="server" TextMode="MultiLine"   
                                Label="Comments: " EmptyMessage="Enter Comments Here" AutoPostBack="true" >   
                            </telerik:RadTextBox>   
                        </td>   
                    </tr>      
                                               
                    <tr>   
                        <td align="right" colspan="2">   
                            <asp:Button ID="btnUpdate" Text='<%# (Container is GridEditFormInsertItem) ? "Insert" : "Update" %>'   
                                runat="server" CommandName='<%# (Container is GridEditFormInsertItem) ? "PerformInsert" : "Update" %>'>   
                            </asp:Button>&nbsp;   
                            <asp:Button ID="btnCancel" Text="Cancel" runat="server" CausesValidation="False"   
                            CommandName="Cancel"></asp:Button></td>   
                    </tr>   
                </table>   
            </FormTemplate>   
        </EditFormSettings>   
    </MasterTableView>   
</telerik:RadGrid>  
Full aspx.cs
using System;   
using System.Collections;   
using System.ComponentModel;   
using System.Data;   
using System.Drawing;   
using System.Web;   
using System.Web.SessionState;   
using System.Web.UI;   
using System.Web.UI.WebControls;   
using System.Web.UI.HtmlControls;   
using AMC.OnlineSCR.BusinessLayer.BusinessObjects;   
using AMC.OnlineSCR.BusinessLayer.Facade;   
using AMC.OnlineSCR.Web.Components;   
using Telerik.Web.UI;   
using G081.WebLogin.CustomProviders;   
using System.Web.Security;   
   
namespace AMC.OnlineSCR.Web.UserControls   
{   
    public partial class Concurrence : System.Web.UI.UserControl   
    {   
        private IApprovalsDataFacade approvalsFacade = new ApprovalsDataFacade();   
        private IUsersDataFacade userFacade = new UsersDataFacade();   
        int m_ConcurrenceID;   
        int m_SCRID;   
   
        public int ConcurrenceID   
        {   
            get { return m_ConcurrenceID; }   
            set { m_ConcurrenceID = value; }   
        }   
   
        public int SCRID   
        {   
            get { return m_SCRID; }   
            set { m_SCRID = value; }   
        }   
   
        public DataSet ConcurrenceData   
        {   
            get   
            {   
                DataSet ds = approvalsFacade.GetApprovalsBySCRID(m_SCRID);   
                return ds;   
            }   
        }   
   
        protected void Page_PreRender(object sender, System.EventArgs e)   
        {   
            if (!this.IsPostBack)   
            {   
                this.gvConcurrence.MasterTableView.Rebind();   
            }   
        }   
   
        protected void CheckBox1_CheckedChanged(object sender, System.EventArgs e)   
        {   
            //this.gvPrograms.AllowMultiRowEdit = this.CheckBox1.Checked;   
            this.gvConcurrence.Rebind();   
        }   
   
        protected void gvConcurrence_NeedDataSource(object source, GridNeedDataSourceEventArgs e)   
        {   
            this.gvConcurrence.DataSource = this.ConcurrenceData;   
        }   
   
        protected void gvConcurrence_InsertCommand(object source, GridCommandEventArgs e)   
        {   
            MembershipUser user = Membership.GetUser();   
            string userName = user.UserName.ToString();   
            DataSet userInfo = userFacade.GetUserWithInfoByUserName(userName.ToUpper());   
            int userID = Convert.ToInt16(userInfo.Tables[0].Rows[0]["USER_ID"].ToString());   
            UserControl userControl = (UserControl)e.Item.FindControl(GridEditFormItem.EditFormUserControlID);   
            DropDownList ddlConcur = (DropDownList)e.Item.FindControl("ddlConcur");   
            string concur = ddlConcur.SelectedValue.ToString();   
            RadTextBox txtComments = (RadTextBox)e.Item.FindControl("txtComments");   
            string comments = txtComments.Text;   
              
            // use 0 for concurrenceID so that you can insert a new record   
            approvalsFacade.insertApprovalsBySCRID(SCRID, 0, userID, concur, comments);   
        }   
   
        protected void gvConcurrence_EditCommand(object source, GridCommandEventArgs e)   
        {   
            //e is the event argument object   
            if (e.Item is GridDataItem)   
            {   
                GridDataItem dataItem = e.Item as GridDataItem;   
                int ConcurrenceID = Convert.ToInt16(dataItem["Concurrence_ID"].Text);   
                int scrID = Convert.ToInt16(dataItem["SCRID"].Text);   
                MembershipUser user = Membership.GetUser();   
                string userName = user.UserName.ToString();   
                DataSet userInfo = userFacade.GetUserWithInfoByUserName(userName.ToUpper());   
                int userID = Convert.ToInt16(userInfo.Tables[0].Rows[0]["USER_ID"].ToString());   
                UserControl userControl = (UserControl)e.Item.FindControl(GridEditFormItem.EditFormUserControlID);   
                DropDownList ddlConcur = (DropDownList)e.Item.FindControl("ddlConcur");   
                string concur = ddlConcur.SelectedValue.ToString();   
                RadTextBox txtComments = (RadTextBox)e.Item.FindControl("txtComments");   
                string comments = txtComments.Text;   
   
                approvalsFacade.insertApprovalsBySCRID(scrID, ConcurrenceID, userID, concur, comments);   
   
            }   
            else if (e.Item is GridEditFormItem)   
            {   
                GridEditFormItem editItem = e.Item as GridEditFormItem;   
                int ConcurrenceID = Convert.ToInt16(editItem["Concurrence_ID"].Text);   
                int scrID = Convert.ToInt16(editItem["SCRID"].Text);   
                MembershipUser user = Membership.GetUser();   
                string userName = user.UserName.ToString();   
                DataSet userInfo = userFacade.GetUserWithInfoByUserName(userName.ToUpper());   
                int userID = Convert.ToInt16(userInfo.Tables[0].Rows[0]["USER_ID"].ToString());   
                UserControl userControl = (UserControl)e.Item.FindControl(GridEditFormItem.EditFormUserControlID);   
                DropDownList ddlConcur = (DropDownList)e.Item.FindControl("ddlConcur");   
                string concur = ddlConcur.SelectedValue.ToString();   
                RadTextBox txtComments = (RadTextBox)e.Item.FindControl("txtComments");   
                string comments = txtComments.Text;   
   
                approvalsFacade.insertApprovalsBySCRID(scrID, ConcurrenceID, userID, concur, comments);   
            }   
        }   
   
        protected void gvConcurrence_DeleteCommand(object source, GridCommandEventArgs e)   
        {   
            //e is the event argument object   
            if (e.Item is GridDataItem)   
            {   
                GridDataItem dataItem = e.Item as GridDataItem;   
                int ConcurrenceID = Convert.ToInt16(dataItem["Concurrence_ID"].Text);   
                approvalsFacade.DeleteApprovalsByConcID(ConcurrenceID);   
   
            }   
            else if (e.Item is GridEditFormItem)   
            {   
                GridEditFormItem editItem = e.Item as GridEditFormItem;   
            }   
   
        }   
   
        private void Page_Load(object sender, System.EventArgs e)   
        {   
            if (!Page.IsPostBack)   
            {   
            }   
        }   
   
        protected void gvConcurrence_ItemDataBound(object sender, GridItemEventArgs e)   
        {   
            //e is the event argument object   
            if (e.Item is GridEditFormItem && e.Item.IsInEditMode)   
            {   
                GridEditFormItem item = (GridEditFormItem)e.Item;   
            }   
            else if (e.Item is GridEditFormItem)   
            {   
                GridEditFormItem editItem = e.Item as GridEditFormItem;   
            }   
        }   
   
    }   
}   
  
Stephen Kumor
Top achievements
Rank 1
 answered on 05 Mar 2010
2 answers
168 views
Hi,

I have an ASP.NET Wizard.  On the first screen, when user select a specific dropdownlist value, I want to put a custom Telerik radconfirm before it goes to next wizard step.  I can't get this thing to work.  Can someone please help me?  Thank you.

 <asp:Wizard ID="wzdJob" runat="server" ActiveStepIndex="0"                          
    DisplayCancelButton="true" Height="250px" Width="550px">  
        <WizardSteps>  
             <asp:WizardStep ID="wzs1" StepType="Start" Title="Step 1" runat="server">  
                      <asp:dropdownlist runat="server" id="ddlDeviceType" />  
             </asp:WizardStep>  
            <asp:WizardStep ID="wzs2" StepType="Step" Title="Step 2" runat="server">  
                       Step 2  
             </asp:WizardStep>  
      </WizardSteps>  
        
</asp:Wizard>  
          
Private Sub ddlDeviceType_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ddlDeviceType.SelectedIndexChanged  
 
       If ddlDeviceType.SelectedValue = "SpecificValue" Then 
            Dim nextbtn As Button  
 
            nextbtn = wzdJob.FindControl("StartNavigationTemplateContainerID").FindControl("StartNextButton")  
 
            nextbtn.OnClientClick = "radconfirm('** Warning Message, proceed? **', CallBackFn, 400, 100);" 
 
        End If 
 
 
    End Sub 
 function CallBackFn(args) {  
 
 
            if (args == true) {  
                //Move to Wizard Step 2             
            } else {  
                //Do nothing  
            }  
              
             
        
        } 
Pei Chen
Top achievements
Rank 1
 answered on 05 Mar 2010
1 answer
109 views
You can see this issue on the telerik demo page here:


Set the minutes per row to 15 (or lower) and alter the breakfast appointment to be from 6:00 am to 10:00 pm.

Change the view to 24 hour view. 

Notice the blue box representing the appointment is drawn correctly up to the 6:00 PM line but there is still the "bottom line" of the box at the 10:00 pm mark but the gap between 6:00 pm and 10:00pm appears blank as if the breakfast appointment does not extend all the way until 10:00 pm.

Since it appears on the demo site i am assuming that this is a known bug. I have tried various search terms here in the forums but I cannot seem to find a reference to this bug or a solution.

If you choose to set minutes per row to 10 minutes the display issue gets worse as the appointment gets cut off at 2 pm. So it appears that an appointment can only have a maximum number of lines drawn.

Another way to demonstrate the bug is to un-check "All-Day Row" and then change the minutes per row value and notice how the "all-day" appointment is drawn, any value under 30 minutes causes a problem.

Any way around this? Is the fix in the next release?  

This has confused and annoyed a lot of my users as they recently requested 15 minute timeslots and now their long time blocks are not visually useful.

Any help or a point toward a post already dealing with this is greatly appreciated

Thanks all!


Peter
Telerik team
 answered on 05 Mar 2010
7 answers
191 views
Hi Guys

I have a radgrid bind with object datasource.
I want to implement sorting on grid columns.but in rad grid automatic sorting is implemented only when the grid is bind with datatables or dataview.

Please provide me a sample which have a grid sort on client side and bind with object datasource.

Its very urgent.

Thanks in advance.
Veli
Telerik team
 answered on 05 Mar 2010
3 answers
120 views
I cannot select GridClienteSelectColumn from code.

I do it in ItemDataBind function.

 protected void dgCategorie_ItemDataBound(object sender, Telerik.Web.UI.GridItemEventArgs e)
    {
        if (e.Item.ItemType != GridItemType.Item && e.Item.ItemType != GridItemType.AlternatingItem)
            return;

        GridDataItem item = (GridDataItem)e.Item; 

        switch (e.Item.OwnerTableView.Name)
        {
            case "categorie":

                 
                var chkAutoriz = (CheckBox)item["ClientSelectColumn"].Controls[0];
                chkAutoriz.Checked = (item["AutorizTuttoCat"].Text == "True") ? true : false;
                break;

            case "analisi" :

                var chkAutorizSottoCat = (CheckBox)item["ClientSelectColumnSotto"].Controls[0];
                chkAutorizSottoCat.Checked = (item["Autoriz"].Text == "True") ? true : false;
                break;
        }

      
    }
Thanks.
Tsvetoslav
Telerik team
 answered on 05 Mar 2010
4 answers
259 views
Hi,

I am working with Rad gird Client-side Insert/Update/Delete. I'm referring the demo code.

I'm getting a null vlaue error for args.get_gridDataItem() when i select a row

 

Here is your code

 

function

 

rowSelected(sender, args)

 

{

 

//controlID = args.getDataKeyValue("ControlID");
Id = getDataItemKeyValue(sender,args.get_gridDataItem());

 

currentRowIndex = args.get_gridDataItem().get_element().rowIndex;

 

$find(

"<%= RadTabStrip1.ClientID %>").set_selectedIndex(0);

 

 

GetControlByControlID(controlID, setValues)

 

}

Whts the problem??

Tsvetoslav
Telerik team
 answered on 05 Mar 2010
1 answer
528 views
Hi,

I generally use Asp.Net Gridview. In these grid i use to add multiple Header rows on Runtime by using "OnRowCreated" Event of the grid.

-----ASP.Net HTML code
 <asp:GridView ID="gv" runat="server" AllowSorting="False" AutoGenerateColumns="False"
                                        Width="350px" UseAccessibleHeader="False"
                                        OnRowDataBound="gv_RowDataBound" OnRowCreated="gv_RowCreated">

---------In Event

protected void gv_RowCreated(object sender, GridViewRowEventArgs e)
    {
            if (e.Row.RowType == DataControlRowType.Header)
            {
                //Header row 1

                GridViewRow headerRow = new GridViewRow(0, 0, DataControlRowType.Header, DataControlRowState.Normal);

                headerRow.Cells.Add(CreateHeaderCell("Col1", "TestCol1", 1, 2,50)); 
                headerRow.Cells.Add(CreateHeaderCell("Col2", "TestCol2", 1, 1,50)); 

                ((GridView)sender).Controls[0].Controls.AddAt(0, headerRow);
               
                //e.Row.Visible = false; //for hiding Normal header row if needed
            }
    }
-------------------- Method for creating a Header cell
 public static TableCell CreateHeaderCell(string text, string tooltipText, int columnSpan, int rowSpan, int colWidth)
        {
            TableHeaderCell headerCell = new TableHeaderCell();
            headerCell.Text = text;
            headerCell.ToolTip = tooltipText;
            headerCell.ColumnSpan = columnSpan;
            headerCell.RowSpan = rowSpan;
            headerCell.Style.Add("text-align", "center");
            headerCell.Font.Bold = false;

            if (colWidth > 0)
            {
                headerCell.Width = colWidth;
            }
            return headerCell;
        }
--------------------------------------------------

Is it also possible to do same with Rad Grid?

Thanks in advance,
Ankur Mittal

Princy
Top achievements
Rank 2
 answered on 05 Mar 2010
1 answer
140 views
Hi,

I'm having a problem when im using ASP ScriptManager control with my update panel.

I have 3 update panels. 2 of them contains a radgrid. When i try to generate a server side event, the page refreshes but after that ... the page is locked.. i can't click a button, i can't write on a textbox etc..

Im using ASP:Scriptmanager, Scriptmanager proxy and 3 update panels, 2 of which has a radgrid in it.


Thanks
Red

Tsvetoslav
Telerik team
 answered on 05 Mar 2010
1 answer
77 views
Hi,

I am using a RadGrid with client-side binding, by implementing <ClientEvents OnDataBinding="RadGrid1_DataBinding" /> as explained in demos.
Now, I want to implement hierarchy in this RadGrid. How can I bind to another webservice method for the DetailedGrid ?
Tsvetoslav
Telerik team
 answered on 05 Mar 2010
Narrow your results
Selected tags
Tags
+? more
Top users last month
Jake
Top achievements
Rank 1
RBarnes
Top achievements
Rank 1
Iron
Iron
Rami
Top achievements
Rank 1
Iron
Veteran
Nathan
Top achievements
Rank 1
Kumeri
Top achievements
Rank 1
Iron
Veteran
Iron
Want to show your ninja superpower to fellow developers?
Top users last month
Jake
Top achievements
Rank 1
RBarnes
Top achievements
Rank 1
Iron
Iron
Rami
Top achievements
Rank 1
Iron
Veteran
Nathan
Top achievements
Rank 1
Kumeri
Top achievements
Rank 1
Iron
Veteran
Iron
Want to show your ninja superpower to fellow developers?
Want to show your ninja superpower to fellow developers?