This is a migrated thread and some comments may be shown as answers.

Add new row on a button click outside the grid. Cant capture values from new row on ItemCommand

2 Answers 226 Views
Grid
This is a migrated thread and some comments may be shown as answers.
Vijay
Top achievements
Rank 1
Vijay asked on 20 Oct 2011, 04:47 PM
Hi All,

I have a scenario where in i have to use button outside the grid to add,modify,delete and submit the changes in a grid. Im able to trigger the "Add" itemcommand on button click when inserting new row but im not able to capture values which the user has inserted in the row.
e.Item.Cells[2].Text returns " "

Following is the code:

ASPX


<%@ Page Language="C#" AutoEventWireup="true" CodeFile="ManageSites.aspx.cs" Inherits="ManageSites" %>
<%@ Register Assembly="Telerik.Web.UI" Namespace="Telerik.Web.UI" TagPrefix="telerik" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 
<link rel="stylesheet" type="text/css" href="eSOMS.css" />
<SCRIPT language="javascript" src="Scripts/ShowError.js"></SCRIPT>
<script language="javascript" src="Scripts/MiscFunctions.js"></script>
<head runat="server">
    <title>Manage Sites</title>  
</head>
<body>
    <form id="form1" runat="server">
      <telerik:RadScriptManager ID="ScriptManager1" runat="server"></telerik:RadScriptManager>
        <telerik:RadAjaxPanel runat="server">
        <table>
        <tr>
            <td colspan="4">
                <telerik:RadGrid runat="server" ID="rgManageSites" AllowAutomaticUpdates="true"
                AllowAutomaticDeletes="true" EnableAsyncRequests="True" AllowAutomaticInserts="true">
                <ClientSettings Selecting-AllowRowSelect="true"></ClientSettings>
                <MasterTableView AutoGenerateColumns="false" EditMode="InPlace" AllowAutomaticInserts="True" AllowAutomaticUpdates="true" AllowAutomaticDeletes="true" CommandItemDisplay="Bottom">
                <Columns>
                     <telerik:GridBoundColumn HeaderText="Facility Id" DataField="Site_Code"></telerik:GridBoundColumn>
                     <telerik:GridBoundColumn HeaderText="Facility Description" DataField="Site_Description"></telerik:GridBoundColumn>
                     <telerik:GridBoundColumn HeaderText="TimeZone Offset" DataField="Time_Zone_Offset"></telerik:GridBoundColumn>
                </Columns>                 
                </MasterTableView>
                </telerik:RadGrid>
            </td>
        </tr>
        <tr>
            <td>
                    <asp:Button ID="btnAdd" runat="server"
                    Text="Add" Width="108px" CausesValidation="false" CssClass="StandardButton" OnClick="btnAdd_Click" CommandName="Add"/>
                 
            </td>
            <td>
                <asp:Button ID="btnDelete" runat="server"
                    Text="Delete" Width="108px" CausesValidation="false" CssClass="StandardButton" OnClick="btnDelete_Click"/>
            </td>
            <td>
                <asp:Button ID="btnModify" runat="server"
                    Text="Modify" Width="108px" CausesValidation="false" CssClass="StandardButton" OnClick="btnModify_Click"/>
            </td>
            <td>
                <asp:Button ID="btnClose" runat="server"
                    Text="Close" Width="108px" CausesValidation="false" CssClass="StandardButton" OnClick="btnClose_Click"/>
            </td>
        </tr>
        </table>
        </telerik:RadAjaxPanel>
    </form>
</body>
</html>

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using Telerik.Web.UI;
using System.Text;
using TechAssist.Data;
 
public partial class ManageSites : System.Web.UI.Page
{
    string userId;
    DataTable dtSites;
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            userId = TechAssist.eSOMS.SharedCommon.CommonUtil.GetUserID();
            dtSites = GetMultiSites().Tables[0]; // returns Datatable as source
            ViewState["dtSites"] = dtSites; // storing it in Viewstate
            rgManageSites.DataSource = dtSites;
             
        }
        else
        {
            //rgManageSites.DataSource = ViewState["dtSites"];
        }
        rgManageSites.ItemCreated += new GridItemEventHandler(rgManageSites_ItemCreated);
        rgManageSites.ItemCommand += new GridCommandEventHandler(rgManageSites_ItemCommand);
    }
    void rgManageSites_ItemCommand(object sender, GridCommandEventArgs e)
    {
        switch (e.CommandName)
        {
            case "Add":
                {                   
                    if ((e.Item is GridDataInsertItem) && e.Item.IsInEditMode)
                    {
                        //e.Item.Cells[2].Text -- returns   
                    }
                    rgManageSites.Rebind();
 
                    break;
                }
        }
    }
    void rgManageSites_ItemCreated(object sender, GridItemEventArgs e)
    {
        if ((e.Item is GridDataInsertItem) && e.Item.IsInEditMode)
        {
            //init insert operation triggered  
        }
        else if ((e.Item is GridEditableItem) && e.Item.IsInEditMode)
        {
            //edit operation triggered  
        }
    }
    protected void btnClose_Click(object sender, EventArgs e)
    {
    }
 
    protected  void btnModify_Click(object sender, EventArgs e)
    {
         
    }
 
    protected void btnDelete_Click(object sender, EventArgs e)
    {
    }
 
    protected void btnAdd_Click(object sender, EventArgs e)
    {
        rgManageSites.MasterTableView.IsItemInserted = true;
        if (btnAdd.Text == "Add")
        {
            rgManageSites.DataSource = ViewState["dtSites"];
            rgManageSites.MasterTableView.InsertItem();// = true; 
            btnAdd.Text = "Apply Add";
 
        }
        else if (btnAdd.Text == "Apply Add")
        {
            btnAdd.Text = "Add";
 
            GridEditableItem insertedItem = rgManageSites.MasterTableView.GetInsertItem();
            insertedItem.FireCommandEvent("Add", String.Empty);
        
    }
    private DataSet GetMultiSites()
    {
        StringBuilder sb = new StringBuilder("select US.SITE_CODE,S.SITE_Description,S.Time_Zone_Offset from user_sites US, Sites S ");
        sb.Append("where US.SITE_CODE = S.SITE_CODE and user_id = '");
 
        sb.Append(userId);
        sb.Append("'");
 
        TechAssist.Data.Database db = new Database();
        TechAssist.Data.DataAdapter da = new TechAssist.Data.DataAdapter(sb.ToString());
        DataSet dsSites = new DataSet();
        try
        {
            da.Fill(dsSites, "Sites");
        }
        catch (System.Exception ex)
        {
            TechAssist.eSOMS.SharedCommon.CommonUtil.SetErrorPopup(
            Page.FindControl("txtErrorMessage"), ex);
 
        }
        return dsSites;
    }
}

Can anyone please tell me how do i capture the values from the newly inserted row?

Thanks,
Vijay

2 Answers, 1 is accepted

Sort by
0
Shinu
Top achievements
Rank 2
answered on 21 Oct 2011, 07:32 AM
Hello Vijay,
You can try the following code snippet to access the newly inserted value.
protected void RadGrid1_ItemCommand(object sender, GridCommandEventArgs e)
 {
        switch (e.CommandName)
        {
            case "Add":
                {
                    if ((e.Item is GridEditFormInsertItem) && e.Item.IsInEditMode)
                    {
                        GridEditFormInsertItem item = (GridEditFormInsertItem)e.Item;
                        TextBox txt = item["Id"].Controls[0] as TextBox;  //use findControl to access template columns
                    }
                    RadGrid1.Rebind();
                    break;
                }
       }
  }

Thanks,
Shinu.
0
Vijay
Top achievements
Rank 1
answered on 24 Oct 2011, 07:17 PM
Thanks Shinu. It works.
But when i add a Validator to the cell of the textbox, the "Text" property of the textbox on "PerformInsert" returns empty string.
The validation works fine and i get the error message, but when valid values are entered and posted i get a empty string for the textbox.

If i do not add the Validator control to the cell then it works fine.Not sure what is causing this strange behavior.

Any idea about it?
    void rgManageSites_ItemCreated(object sender, GridItemEventArgs e)
    {
        if (e.Item.IsInEditMode && !e.Item.OwnerTableView.IsItemInserted)
       {
           GridEditableItem editedItem = e.Item as GridEditableItem;
           TextBox tbSiteCode = editedItem["Site_Code"].Controls[0] as TextBox;
          
           if(!IsItemNew)
               tbSiteCode.Enabled = false;
       }      
        if ((e.Item is GridEditableItem) && e.Item.IsInEditMode)
        {
            GridEditableItem editedItem = e.Item as GridEditableItem;
           //If i do not add these validators then im able to capture values correctly.
            GridTextBoxColumnEditor editor = (GridTextBoxColumnEditor)editedItem.EditManager.GetColumnEditor("Site_Code");
            TableCell cell = (TableCell)editor.TextBoxControl.Parent;
            editor.TextBoxControl.MaxLength = 3;
            RequiredFieldValidator reqFldSiteCode = new RequiredFieldValidator();
            reqFldSiteCode.ErrorMessage = "*";
            editor.TextBoxControl.ID = "tbSiteCode";
            reqFldSiteCode.ControlToValidate = editor.TextBoxControl.ID;
            cell.Controls.Add(reqFldSiteCode);
 
            editor = (GridTextBoxColumnEditor)editedItem.EditManager.GetColumnEditor("Site_Description");
            cell = (TableCell)editor.TextBoxControl.Parent;
            editor.TextBoxControl.MaxLength = 30;
            RequiredFieldValidator reqFldSiteDesc = new RequiredFieldValidator();
            reqFldSiteDesc.ErrorMessage = "*";
            editor.TextBoxControl.ID = "tbSiteDescription";
             
            reqFldSiteDesc.ControlToValidate = editor.TextBoxControl.ID;
            cell.Controls.Add(reqFldSiteDesc);
 
            editor = (GridTextBoxColumnEditor)editedItem.EditManager.GetColumnEditor("Time_Zone_Offset");
            cell = (TableCell)editor.TextBoxControl.Parent;
            RequiredFieldValidator reqFldTimeZone = new RequiredFieldValidator();
            reqFldTimeZone.ErrorMessage = "*";
            editor.TextBoxControl.ID = "tbTimeZone";      
            reqFldTimeZone.ControlToValidate = editor.TextBoxControl.ID;
            cell.Controls.Add(reqFldTimeZone);          
        }       
    }
 
 protected void btnAdd_Click(object sender, EventArgs e)
    {
        rgManageSites.MasterTableView.IsItemInserted = true;
        rgManageSites.DataSource = ViewState["dtSites"];
        rgManageSites.MasterTableView.InsertItem();
        panel4Button.Visible = false;
        panel2Button.Visible = true
    }
 
  void rgManageSites_InsertCommand(object sender, GridCommandEventArgs e)
    {
        GridDataInsertItem item = e.Item as GridDataInsertItem;
        if (item != null)
        {
            string strSiteCode = ((TextBox)item["Site_Code"].Controls[0]).Text; // Return empty when i add validator control else it works fine
            string strSiteDesc = ((TextBox)item["Site_Description"].Controls[0]).Text;
            string strTimeZoneOffset = ((TextBox)item["Time_Zone_Offset"].Controls[0]).Text;
 
            dtSites = (DataTable)ViewState["dtSites"];
 
            DataRow dr = dtSites.NewRow();
            dr[0] = strSiteCode; ;
            dr[1] = strSiteDesc;
            dr[2] = strTimeZoneOffset;
            dtSites.Rows.Add(dr);
            rgManageSites.DataSource = dtSites;
        }
    }
//External OK button to Perform Insert
    protected void btnOk_Click(object sender, EventArgs e)
    {
        Page.Validate();
        if (Page.IsValid)
        {
            if (rgManageSites.MasterTableView.IsItemInserted)
            {
                rgManageSites.MasterTableView.GetInsertItem().FireCommandEvent(RadGrid.PerformInsertCommandName, string.Empty);
                rgManageSites.DataSource = ViewState["dtSites"];
            }
            else if (rgManageSites.MasterTableView.GetItems(GridItemType.EditItem).Count() == 1)
            {
                ((GridItem[])rgManageSites.MasterTableView.GetItems(GridItemType.EditItem))[0].FireCommandEvent(RadGrid.UpdateCommandName, string.Empty);
                rgManageSites.DataSource = ViewState["dtSites"];
                rgManageSites.Rebind();
            }
            panel2Button.Visible = false;
            panel4Button.Visible = true;
        }
    }
Tags
Grid
Asked by
Vijay
Top achievements
Rank 1
Answers by
Shinu
Top achievements
Rank 2
Vijay
Top achievements
Rank 1
Share this question
or