C# 在 ItemDataBound 中检索 RadGrid 单元格值 - “输入字符串的格式不正确。”

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/9066572/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-09 05:46:41  来源:igfitidea点击:

Retrieve RadGrid cell value in ItemDataBound - "Input string was not in a correct format."

c#asp.netradgriditemdatabound

提问by Will

I am trying to set a CssClass based on a the comparison of two cell values in my radGrid. Both cells are formatted for currency {0:c}, so that when I compare them, I have a $ sign in the text string. I know how to parse a string to remove the $ sign, which is what I am doing. However, is there a way to get the raw text of the cell prior to formatting, so that I will not have this error?

我正在尝试根据 radGrid 中两个单元格值的比较来设置 CssClass。两个单元格的格式都为 currency {0:c},因此当我比较它们时,文本字符串中有一个 $ 符号。我知道如何解析字符串以删除 $ 符号,这就是我正在做的。但是,有没有办法在格式化之前获取单元格的原始文本,以免出现此错误?

Here is my code:

这是我的代码:

ASPX:

ASPX:

                        <telerik:RadGrid ID="rgCISPartsInfo" DataSourceID="dsCISItem" AutoGenerateColumns="False"
                        GridLines="None" AllowPaging="False" OnItemDataBound="rgCISPartsInfo_ItemDataBound" runat="server" Width="676px">
                        <MasterTableView AllowPaging="False" DataKeyNames="SalesOrderItemId">
                            <Columns>
                                <telerik:GridBoundColumn HeaderText="COST" DataField="AverageCostPrice" AllowSorting="false"
                                    DataFormatString="{0:c}" HeaderStyle-HorizontalAlign="right" ItemStyle-HorizontalAlign="right"
                                    HeaderStyle-Width="80px">
                                </telerik:GridBoundColumn>
                                <telerik:GridBoundColumn DataField="ExtendedCost" HeaderText="X COST" DataFormatString="{0:c}" HeaderStyle-HorizontalAlign="right" 
                                HeaderStyle-Width="80px" ItemStyle-HorizontalAlign="right"></telerik:GridBoundColumn>
                                <telerik:GridBoundColumn DataField="Weight" HeaderText="WT" HeaderStyle-HorizontalAlign="right" HeaderStyle-Width="80px" 
                                ItemStyle-HorizontalAlign="right"></telerik:GridBoundColumn>
                            </Columns>
                        </MasterTableView>
                    </telerik:RadGrid>

C#:

C#:

protected void rgCISPartsInfo_ItemDataBound(object sender, GridItemEventArgs e)
{
    try
    {
        // only access item if not header or footer cell
        if ((e.Item.ItemType == GridItemType.Item) || (e.Item.ItemType == GridItemType.AlternatingItem))
        {
            GridDataItem dataItem = e.Item as GridDataItem;
            GridColumn column = rgCISPartsInfo.MasterTableView.GetColumn("AverageCostPrice");

            decimal cost = Convert.ToDecimal(dataItem["AverageCostPrice"].Text);
            decimal price = Convert.ToDecimal(dataItem["Price"].Text);
            if (cost > price)
            {
                dataItem.CssClass = "Grid_Red_Row";
                throw new Exception("Item Cost is greater than price.");
            }
        }
    }
    catch (Exception ex)
    {
        GlobalHelper.ShowErrorMessage(this.Page.Master, ex.Message);
    }
}

UPDATE: The selected solution is the answer to my question, but I ultimately decided to simply parse the string for the $ sign, as it was the simplest solution.

更新:选定的解决方案是我的问题的答案,但我最终决定简单地解析 $ 符号的字符串,因为它是最简单的解决方案。

采纳答案by SimSimY

I would add RadGridDataBound filed with visible="fasle"and different unique name and access it from the code behind.

我会添加带有visible="fasle"不同唯一名称的RadGridDataBound并从后面的代码访问它。

 <telerik:RadGrid ID="rgCISPartsInfo" DataSourceID="dsCISItem" AutoGenerateColumns="False"
                        GridLines="None" AllowPaging="False" OnItemDataBound="rgCISPartsInfo_ItemDataBound" runat="server" Width="676px">
                        <MasterTableView AllowPaging="False" DataKeyNames="SalesOrderItemId">
                            <Columns>
                                <telerik:GridBoundColumn HeaderText="COST" DataField="AverageCostPrice" AllowSorting="false"
                                    DataFormatString="{0:c}" HeaderStyle-HorizontalAlign="right" ItemStyle-HorizontalAlign="right"
                                    HeaderStyle-Width="80px">
                                </telerik:GridBoundColumn>
                                       <telerik:GridBoundColumn HeaderText="COST" DataField="AverageCostPrice" Visiable="false" uniqueName="AverageCostPrice1"  DataField="AverageCostPrice" >
                                </telerik:GridBoundColumn>
                                <telerik:GridBoundColumn DataField="ExtendedCost" HeaderText="X COST" DataFormatString="{0:c}" HeaderStyle-HorizontalAlign="right" 
                                HeaderStyle-Width="80px" ItemStyle-HorizontalAlign="right"></telerik:GridBoundColumn>
                                <telerik:GridBoundColumn DataField="Weight" HeaderText="WT" HeaderStyle-HorizontalAlign="right" HeaderStyle-Width="80px" 
                                ItemStyle-HorizontalAlign="right"></telerik:GridBoundColumn>
                            </Columns>
                        </MasterTableView>
                    </telerik:RadGrid>

C#

C#

  decimal cost = Convert.ToDecimal(dataItem["AverageCostPrice1"].Text);

PS:Another idea I just had is to assign the DataFormatStringdurring the ItemDataBoundevent. this way you'll have the raw string.

PS:我刚刚想到的另一个想法是DataFormatStringItemDataBound活动期间分配。这样你就有了原始字符串。

回答by Bill Martin

One option is to not use format string in the markup and do it in the ItemDataBound event instead.

一种选择是不在标记中使用格式字符串,而是在 ItemDataBound 事件中使用它。