I have a user control with a RadGrid that I am using for data entry. I used the examples in the following older posts, and it works, but I am experiencing severe performance issues when the grid grows to about 40 lines
Is there a better way to accomplish multi-line data entry? I am willing to go a different direction or use a different control if necessary. Here is my current code...
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="InputFormFundsBreakdown.ascx.cs"
Inherits="Controls_InputFormFundsBreakdown" %>
<table align="left" cellpadding="5" width="100%">
<tr>
<td align="center" colspan="2">
<h3>
Funds Breakdown
<asp:Image ID="imgFundsHelp" runat="server" ImageUrl="~/Images/help.png" />
<telerik:RadToolTip ID="tipFundsHelp" runat="server" HideEvent="LeaveTargetAndToolTip"
Position="TopRight" TargetControlID="imgFundsHelp">
Help goes here
</telerik:RadToolTip>
</h3>
</td>
</tr>
<tr>
<td colspan="2">
<asp:Label ID="errFundsMessage" runat="server" ForeColor="Red"></asp:Label>
</td>
</tr>
<tr>
<td colspan="2">
<telerik:RadGrid ID="grdFunds" runat="server" AutoGenerateColumns="False" OnDataBound="grdFunds_DataBound"
OnNeedDataSource="grdFunds_NeedDataSource">
<MasterTableView DataKeyNames="RowNumber" AlternatingItemStyle-BackColor="#DAE2E8">
<ItemStyle VerticalAlign="Top" />
<Columns>
<telerik:GridTemplateColumn HeaderText="Fund Name">
<ItemTemplate>
<telerik:RadTextBox ID="txtFundName" runat="server" MaxLength="100" Width="85px"
Text='<%# Eval("FundName")%>'>
</telerik:RadTextBox>
</ItemTemplate>
</telerik:GridTemplateColumn>
<telerik:GridTemplateColumn HeaderText="* Fund Number">
<ItemTemplate>
<telerik:RadTextBox ID="txtFundNumber" runat="server" Width="85px" MaxLength="100"
Text='<%# Eval("FundNumber")%>'>
<ClientEvents OnKeyPress="NumericOnly" />
</telerik:RadTextBox>
<br />
<asp:Label ID="errFundNumber" runat="server" ForeColor="Red"></asp:Label>
</ItemTemplate>
</telerik:GridTemplateColumn>
<telerik:GridTemplateColumn HeaderText="* Account">
<ItemTemplate>
<telerik:RadTextBox ID="txtAccount" runat="server" Width="85px" MaxLength="100" Text='<%# Eval("Account")%>'>
</telerik:RadTextBox>
<br />
<asp:Label ID="errAccount" runat="server" ForeColor="Red"></asp:Label>
</ItemTemplate>
</telerik:GridTemplateColumn>
<telerik:GridTemplateColumn HeaderText="Subledger">
<ItemTemplate>
<telerik:RadTextBox ID="txtSubledger" runat="server" Width="85px" MaxLength="100"
Text='<%# Eval("Subledger")%>'>
<ClientEvents OnKeyPress="NumericOnly" />
</telerik:RadTextBox>
<br />
<asp:Label ID="errSubledger" runat="server" ForeColor="Red"></asp:Label>
</ItemTemplate>
</telerik:GridTemplateColumn>
<telerik:GridTemplateColumn HeaderText="T Code">
<ItemTemplate>
<asp:HiddenField ID="hdnTCode" runat="server" Value='<%# Eval("TCode")%>' />
<telerik:RadDropDownList ID="ddlTCode" runat="server" Width="40px">
<Items>
<telerik:DropDownListItem Value="" Text=" " />
<telerik:DropDownListItem Value="W" Text="W" />
<telerik:DropDownListItem Value="A" Text="A" />
</Items>
</telerik:RadDropDownList>
<br />
<asp:Label ID="errTCode" runat="server" ForeColor="Red"></asp:Label>
</ItemTemplate>
</telerik:GridTemplateColumn>
<telerik:GridTemplateColumn HeaderText="* Amount">
<ItemTemplate>
<telerik:RadNumericTextBox ID="txtFundAmount" runat="server" DataType="System.Decimal"
Width="85px" MaxLength="100" NumberFormat-DecimalDigits="2" Type="Currency" DbValue='<%# Eval("Amount")%>'
IncrementSettings-InterceptMouseWheel="False">
</telerik:RadNumericTextBox><br />
<asp:Label ID="errFundAmount" runat="server" ForeColor="Red"></asp:Label>
</ItemTemplate>
</telerik:GridTemplateColumn>
<telerik:GridTemplateColumn HeaderText="Memo">
<ItemTemplate>
<telerik:RadTextBox ID="txtFundMemo" runat="server" Width="145px" Text='<%# Eval("Memo")%>'>
</telerik:RadTextBox>
</ItemTemplate>
</telerik:GridTemplateColumn>
<telerik:GridTemplateColumn>
<ItemTemplate>
<telerik:RadButton ID="btnDeleteFundLine" runat="server" Text="Delete" CssClass="classDeleteImage"
HoveredCssClass="classDeleteHoveredImage" PressedCssClass="classDeletePressedImage"
OnCommand="btnDeleteFundLine_Command" CommandArgument='<%# Eval("RowNumber")%>'>
<Image EnableImageButton="true" />
</telerik:RadButton>
</ItemTemplate>
</telerik:GridTemplateColumn>
</Columns>
</MasterTableView>
</telerik:RadGrid>
</td>
</tr>
<tr>
<td colspan="2">
</td>
</tr>
<tr>
<td>
<telerik:RadNumericTextBox ID="txtNumberOfRows" runat="server" Width="50px" MinValue="1"
ShowSpinButtons="true" DataType="System.Int32" NumberFormat-DecimalDigits="0" Value="1">
</telerik:RadNumericTextBox>
<telerik:RadButton ID="btnAddFundRow" runat="server" Font-Bold="True" Icon-PrimaryIconCssClass="rbAdd"
Text="Add Rows" OnClick="btnAddFundRow_Click">
</telerik:RadButton>
</td>
<td align="right">
<asp:Label ID="lblFundsTotal" runat="server" Font-Bold="true"></asp:Label>
<telerik:RadButton ID="btnCalculateFunds" runat="server" Font-Bold="True" Text="Calculate"
Icon-PrimaryIconUrl="~/Images/calc.jpg" OnClick="btnCalculateFunds_Click">
</telerik:RadButton>
</td>
</tr>
</table>
using System;
using System.Data;
using System.Web.UI.WebControls;
using Telerik.Web.UI;
using dsCashTransmittalTableAdapters;
public partial class Controls_InputFormFundsBreakdown : System.Web.UI.UserControl
{
public DataTable FundsTable
{
get;
private set;
}
protected void Page_Load(object sender, EventArgs e)
{
if (ViewState["FundsTable"] == null)
{
FundsTable = DefineFundsDataTable();
AddFiveRows();
}
else
{
FundsTable = (DataTable)ViewState["FundsTable"];
}
}
public decimal CalculateTotal()
{
decimal totalAmount = 0;
try
{
foreach (GridDataItem item in grdFunds.Items)
{
RadNumericTextBox txtFundAmount = (RadNumericTextBox)item.FindControl("txtFundAmount");
totalAmount += Convert.ToDecimal(txtFundAmount.Value);
}
}
catch (Exception)
{
totalAmount = 0;
}
return totalAmount;
}
public int CountEntries()
{
int cnt = 0;
try
{
foreach (GridDataItem item in grdFunds.Items)
{
RadNumericTextBox txtFundAmount = (RadNumericTextBox)item.FindControl("txtFundAmount");
if (txtFundAmount.Value != 0)
{
cnt++;
}
}
}
catch (Exception)
{
cnt = 0;
}
return cnt;
}
public void ResetValidation()
{
errFundsMessage.Text = "";
foreach (GridDataItem item in grdFunds.Items)
{
Label errFundNumber = (Label)item.FindControl("errFundNumber");
errFundNumber.Text = "";
Label errAccount = (Label)item.FindControl("errAccount");
errAccount.Text = "";
Label errSubledger = (Label)item.FindControl("errSubledger");
errSubledger.Text = "";
Label errTCode = (Label)item.FindControl("errTCode");
errTCode.Text = "";
Label errFundAmount = (Label)item.FindControl("errFundAmount");
errFundAmount.Text = "";
}
ShowCalculatedTotals();
}
public void ShowCalculatedTotals()
{
lblFundsTotal.Text = "Total: " + CalculateTotal().ToString("C");
}
public bool ValidateForm(bool valid, ref string logMsg, bool twoFundsRequired, bool oneFundRequired)
{
bool hasFund = false;
bool num = false;
bool acct = false;
bool tcode = false;
bool sub = false;
//bool amt = false;
foreach (GridDataItem item in grdFunds.Items)
{
RadTextBox txtFundName = (RadTextBox)item.FindControl("txtFundName");
RadTextBox txtFundNumber = (RadTextBox)item.FindControl("txtFundNumber");
Label errFundNumber = (Label)item.FindControl("errFundNumber");
RadTextBox txtAccount = (RadTextBox)item.FindControl("txtAccount");
Label errAccount = (Label)item.FindControl("errAccount");
RadTextBox txtSubledger = (RadTextBox)item.FindControl("txtSubledger");
Label errSubledger = (Label)item.FindControl("errSubledger");
RadDropDownList ddlTCode = (RadDropDownList)item.FindControl("ddlTCode");
Label errTCode = (Label)item.FindControl("errTCode");
RadNumericTextBox txtFundAmount = (RadNumericTextBox)item.FindControl("txtFundAmount");
//Label errFundAmount = (Label)item.FindControl("errFundAmount");
RadTextBox txtFundMemo = (RadTextBox)item.FindControl("txtFundMemo");
if (txtFundAmount.Text == string.Empty)
{
txtFundAmount.Value = 0;
}
if (txtFundName.Text != string.Empty ||
txtFundNumber.Text != string.Empty ||
txtAccount.Text != string.Empty ||
txtSubledger.Text != string.Empty ||
ddlTCode.SelectedValue != string.Empty ||
txtFundAmount.Value != 0 ||
txtFundMemo.Text != string.Empty)
{
if (txtFundAmount.Value == 0)
{
//errFundAmount.Text = "Required";
//amt = true;
//txtFundAmount.Focus();
//valid = false;
}
else
{
hasFund = true;
if (txtSubledger.Text != string.Empty && ddlTCode.SelectedValue == string.Empty)
{
errTCode.Text = "Required";
tcode = true;
ddlTCode.Focus();
valid = false;
}
else if (ddlTCode.SelectedValue != string.Empty && txtSubledger.Text == string.Empty)
{
errSubledger.Text = "Required";
sub = true;
txtSubledger.Focus();
valid = false;
}
if (txtAccount.Text == string.Empty)
{
errAccount.Text = "Required";
acct = true;
txtAccount.Focus();
valid = false;
}
if (txtFundNumber.Text == string.Empty)
{
errFundNumber.Text = "Required";
num = true;
txtFundNumber.Focus();
valid = false;
}
}
}
}
if (!hasFund && oneFundRequired)
{
if (twoFundsRequired)
{
errFundsMessage.Text = "Enter at least two funds";
logMsg = "<li><b>At least two Funds</b> is Required</li>" + logMsg;
}
else
{
errFundsMessage.Text = "Enter at least one fund";
logMsg = "<li><b>At least one Fund</b> is Required</li>" + logMsg;
}
grdFunds.Focus();
valid = false;
}
else
{
//if (amt)
//{
// logMsg = "<li><b>Fund Amount</b> is Required</li>" + logMsg;
//}
if (tcode)
{
logMsg = "<li><b>Fund T Code</b> is Required</li>" + logMsg;
}
if (sub)
{
logMsg = "<li><b>Fund Subledger</b> is Required</li>" + logMsg;
}
if (acct)
{
logMsg = "<li><b>Fund Account</b> is Required</li>" + logMsg;
}
if (num)
{
logMsg = "<li><b>Fund Number</b> is Required</li>" + logMsg;
}
UpdateFundTableFromGrid();
}
return valid;
}
public void AddGridErrorMessage(string msg)
{
errFundsMessage.Text = msg;
}
public void ResetForm()
{
//FundsTable = DefineFundsDataTable();
//BindFundGrid();
ShowCalculatedTotals();
}
public void LoadForm(CTCommonRequests req)
{
FundsTable = LoadFundsDataSource(req.GetCTFundsBreakdown());
AddFiveRows();
FillFundFields();
ShowCalculatedTotals();
}
public void LoadTemplate(int templateID)
{
TemplateFunds_vTableAdapter taFund = new TemplateFunds_vTableAdapter();
FundsTable = LoadFundsTemplateDataSource(taFund.GetDataByTemplateID(templateID));
AddFiveRows();
FillFundFields();
ShowCalculatedTotals();
}
public void UpdateFundTableFromGrid()
{
FundsTable = DefineFundsDataTable();
foreach (GridDataItem item in grdFunds.Items)
{
RadNumericTextBox txtFundAmount = (RadNumericTextBox)item.FindControl("txtFundAmount");
if (Convert.ToDecimal(txtFundAmount.Value) != 0)
{
DataRow row = FundsTable.NewRow();
row["RowNumber"] = item.GetDataKeyValue("RowNumber").ToString();
RadTextBox txtFundName = (RadTextBox)item.FindControl("txtFundName");
row["FundName"] = txtFundName.Text;
RadTextBox txtFundNumber = (RadTextBox)item.FindControl("txtFundNumber");
row["FundNumber"] = txtFundNumber.Text;
RadTextBox txtAccount = (RadTextBox)item.FindControl("txtAccount");
row["Account"] = txtAccount.Text;
RadTextBox txtSubledger = (RadTextBox)item.FindControl("txtSubledger");
row["Subledger"] = txtSubledger.Text;
RadDropDownList ddlTCode = (RadDropDownList)item.FindControl("ddlTCode");
row["TCode"] = ddlTCode.SelectedValue;
row["Amount"] = Convert.ToDecimal(txtFundAmount.Value);
RadTextBox txtFundMemo = (RadTextBox)item.FindControl("txtFundMemo");
row["Memo"] = txtFundMemo.Text;
FundsTable.Rows.Add(row);
}
}
}
public void UpdateTemplateFundTableFromGrid()
{
FundsTable = DefineFundsDataTable();
foreach (GridDataItem item in grdFunds.Items)
{
RadTextBox txtFundName = (RadTextBox)item.FindControl("txtFundName");
RadTextBox txtFundNumber = (RadTextBox)item.FindControl("txtFundNumber");
RadTextBox txtAccount = (RadTextBox)item.FindControl("txtAccount");
RadTextBox txtSubledger = (RadTextBox)item.FindControl("txtSubledger");
RadDropDownList ddlTCode = (RadDropDownList)item.FindControl("ddlTCode");
RadNumericTextBox txtFundAmount = (RadNumericTextBox)item.FindControl("txtFundAmount");
RadTextBox txtFundMemo = (RadTextBox)item.FindControl("txtFundMemo");
if (txtFundName.Text.Trim() != string.Empty ||
txtFundNumber.Text.Trim() != string.Empty ||
txtAccount.Text.Trim() != string.Empty ||
txtSubledger.Text.Trim() != string.Empty ||
(ddlTCode.SelectedIndex > -1 && ddlTCode.SelectedValue != "") ||
txtFundMemo.Text.Trim() != string.Empty)
{
DataRow row = FundsTable.NewRow();
row["RowNumber"] = item.GetDataKeyValue("RowNumber").ToString();
row["FundName"] = txtFundName.Text;
row["FundNumber"] = txtFundNumber.Text;
row["Account"] = txtAccount.Text;
row["Subledger"] = txtSubledger.Text;
row["TCode"] = ddlTCode.SelectedValue;
row["Amount"] = Convert.ToDecimal(txtFundAmount.Value);
row["Memo"] = txtFundMemo.Text;
FundsTable.Rows.Add(row);
}
}
}
protected void grdFunds_DataBound(object sender, EventArgs e)
{
ShowCalculatedTotals();
}
protected void btnAddFundRow_Click(object sender, EventArgs e)
{
ResetValidation();
FundsTable = DefineFundsDataTable();
foreach (GridDataItem item in grdFunds.Items)
{
DataRow row = FundsTable.NewRow();
row["RowNumber"] = item.GetDataKeyValue("RowNumber").ToString();
RadTextBox txtFundName = (RadTextBox)item.FindControl("txtFundName");
row["FundName"] = txtFundName.Text;
RadTextBox txtFundNumber = (RadTextBox)item.FindControl("txtFundNumber");
row["FundNumber"] = txtFundNumber.Text;
RadTextBox txtAccount = (RadTextBox)item.FindControl("txtAccount");
row["Account"] = txtAccount.Text;
RadTextBox txtSubledger = (RadTextBox)item.FindControl("txtSubledger");
row["Subledger"] = txtSubledger.Text;
RadDropDownList ddlTCode = (RadDropDownList)item.FindControl("ddlTCode");
row["TCode"] = ddlTCode.SelectedValue;
RadNumericTextBox txtFundAmount = (RadNumericTextBox)item.FindControl("txtFundAmount");
row["Amount"] = Convert.ToDecimal(txtFundAmount.Value);
RadTextBox txtFundMemo = (RadTextBox)item.FindControl("txtFundMemo");
row["Memo"] = txtFundMemo.Text;
FundsTable.Rows.Add(row);
}
for (int x = 0; x < txtNumberOfRows.Value; x++)
{
FundsTable = AddFundsRow(FundsTable);
}
grdFunds.Rebind();
FillFundFields();
}
protected void btnDeleteFundLine_Command(object sender, CommandEventArgs e)
{
int rowNumber = Convert.ToInt32(e.CommandArgument);
ResetValidation();
FundsTable = DefineFundsDataTable();
foreach (GridDataItem item in grdFunds.Items)
{
DataRow row = FundsTable.NewRow();
row["RowNumber"] = item.GetDataKeyValue("RowNumber").ToString();
RadTextBox txtFundName = (RadTextBox)item.FindControl("txtFundName");
row["FundName"] = txtFundName.Text;
RadTextBox txtFundNumber = (RadTextBox)item.FindControl("txtFundNumber");
row["FundNumber"] = txtFundNumber.Text;
RadTextBox txtAccount = (RadTextBox)item.FindControl("txtAccount");
row["Account"] = txtAccount.Text;
RadTextBox txtSubledger = (RadTextBox)item.FindControl("txtSubledger");
row["Subledger"] = txtSubledger.Text;
RadDropDownList ddlTCode = (RadDropDownList)item.FindControl("ddlTCode");
row["TCode"] = ddlTCode.SelectedValue;
RadNumericTextBox txtFundAmount = (RadNumericTextBox)item.FindControl("txtFundAmount");
row["Amount"] = Convert.ToDecimal(txtFundAmount.Value);
RadTextBox txtFundMemo = (RadTextBox)item.FindControl("txtFundMemo");
row["Memo"] = txtFundMemo.Text;
FundsTable.Rows.Add(row);
}
FundsTable = DeleteFundsRow(FundsTable, rowNumber);
//grdFunds.DataSource = FundsTable;
grdFunds.Rebind();
//foreach (GridDataItem item in grdFunds.Items)
//{
// HiddenField hdnTCode = (HiddenField)item.FindControl("hdnTCode");
// RadDropDownList ddlTCode = (RadDropDownList)item.FindControl("ddlTCode");
// ddlTCode.SelectedValue = hdnTCode.Value;
//}
FillFundFields();
}
protected void btnCalculateFunds_Click(object sender, EventArgs e)
{
lblFundsTotal.Text = "Total: " + CalculateTotal().ToString("C");
}
private void AddFiveRows()
{
for (int x = 1; x < 6; x++)
{
FundsTable = AddFundsRow(FundsTable);
}
//grdFunds.DataSource = FundsTable;
grdFunds.Rebind();
}
private DataTable DefineFundsDataTable()
{
DataTable dt = new DataTable("FundsBreakdown");
DataColumn dc = new DataColumn("RowNumber");
dc.DataType = Type.GetType("System.Int32");
dt.Columns.Add(dc);
dc = new DataColumn("FundName");
dc.DataType = Type.GetType("System.String");
dt.Columns.Add(dc);
dc = new DataColumn("FundNumber");
dc.DataType = Type.GetType("System.String");
dt.Columns.Add(dc);
dc = new DataColumn("Account");
dc.DataType = Type.GetType("System.String");
dt.Columns.Add(dc);
dc = new DataColumn("Subledger");
dc.DataType = Type.GetType("System.String");
dt.Columns.Add(dc);
dc = new DataColumn("TCode");
dc.DataType = Type.GetType("System.String");
dt.Columns.Add(dc);
dc = new DataColumn("Amount");
dc.DataType = Type.GetType("System.Decimal");
dt.Columns.Add(dc);
dc = new DataColumn("Memo");
dc.DataType = Type.GetType("System.String");
dt.Columns.Add(dc);
return dt;
}
private DataTable AddFundsRow(DataTable dt)
{
DataRow row = dt.NewRow();
row["RowNumber"] = dt.Rows.Count + 1;
row["FundName"] = "";
row["FundNumber"] = "";
row["Account"] = "";
row["Subledger"] = "";
row["TCode"] = "";
row["Amount"] = 0;
row["Memo"] = "";
dt.Rows.Add(row);
return dt;
}
private DataTable DeleteFundsRow(DataTable dt, int deleteRow)
{
DataTable deletedRowTable = DefineFundsDataTable();
foreach (DataRow sourceRow in dt.Rows)
{
if (Convert.ToInt32(sourceRow["RowNumber"]) != deleteRow)
{
DataRow row = deletedRowTable.NewRow();
row["RowNumber"] = deletedRowTable.Rows.Count + 1;
row["FundName"] = sourceRow["FundName"];
row["FundNumber"] = sourceRow["FundNumber"];
row["Account"] = sourceRow["Account"];
row["Subledger"] = sourceRow["Subledger"];
row["TCode"] = sourceRow["TCode"];
row["Amount"] = sourceRow["Amount"];
row["Memo"] = sourceRow["Memo"];
deletedRowTable.Rows.Add(row);
}
}
return deletedRowTable;
}
private DataTable LoadFundsDataSource(DataTable sourceDT)
{
DataTable filledDataTable = DefineFundsDataTable();
foreach (DataRow sourceRow in sourceDT.Rows)
{
DataRow row = filledDataTable.NewRow();
row["RowNumber"] = filledDataTable.Rows.Count + 1;
row["FundName"] = sourceRow["FundName"];
row["FundNumber"] = sourceRow["FundNumber"];
row["Account"] = sourceRow["AccountNumber"];
row["Subledger"] = sourceRow["Subledger"];
row["TCode"] = sourceRow["TCode"];
row["Amount"] = sourceRow["FundAmount"];
row["Memo"] = sourceRow["FundMemo"];
filledDataTable.Rows.Add(row);
}
return filledDataTable;
}
private DataTable LoadFundsTemplateDataSource(DataTable sourceDT)
{
DataTable filledDataTable = DefineFundsDataTable();
foreach (DataRow sourceRow in sourceDT.Rows)
{
DataRow row = filledDataTable.NewRow();
row["RowNumber"] = filledDataTable.Rows.Count + 1;
row["FundName"] = sourceRow["TemplateFundName"];
row["FundNumber"] = sourceRow["TemplateFundNumber"];
row["Account"] = sourceRow["TemplateAccountNumber"];
row["Subledger"] = sourceRow["TemplateSubledger"];
row["TCode"] = sourceRow["TemplateTCode"];
row["Amount"] = 0;
row["Memo"] = sourceRow["TemplateFundMemo"];
filledDataTable.Rows.Add(row);
}
return filledDataTable;
}
private void FillFundFields()
{
foreach (GridDataItem item in grdFunds.Items)
{
HiddenField hdnTCode = (HiddenField)item.FindControl("hdnTCode");
RadDropDownList ddlTCode = (RadDropDownList)item.FindControl("ddlTCode");
if (hdnTCode.Value == "")
{
ddlTCode.SelectedIndex = -1;
}
else
{
ddlTCode.SelectedValue = hdnTCode.Value;
}
}
}
protected void grdFunds_NeedDataSource(object sender, GridNeedDataSourceEventArgs e)
{
ViewState["FundsTable"] = FundsTable;
grdFunds.DataSource = FundsTable;
}
}