asp.net 如何将GridView字符串列转换为整型或双精度列?

cl25kdpy  于 2022-12-15  发布在  .NET
关注(0)|答案(2)|浏览(131)

下面是我的GridView中的一个字符串列:

Convert.ToString(GridView1.Rows[t].Cells[2].Text)

我试着把它转换成双列:

Convert.ToDouble(GridView1.Rows[t].Cells[2].Text)

也尝试过这个

double x = double.Parse(GridView1.Rows[t].Cells[2].Text)

但总是抛出异常:“输入字符串格式不正确”
只有这样输入Convert.ToString(GridView1.Rows[t].Cells[2].Text)代码才会运行
但是里面有数字值,需要以数字而不是字符串的形式获取值...
我在GridView中使用绑定字段和模板字段:

<asp:GridView ID="GridView1" runat="server" Width ="219px" Height="258px">
                    <Columns>
                        <asp:BoundField AccessibleHeaderText="k1" HeaderText="k1" />
                        <asp:BoundField AccessibleHeaderText="k2" HeaderText="k2" />

                        <asp:TemplateField AccessibleHeaderText="Rank1" HeaderText="Rank1">

            <ItemTemplate>
                <asp:Label ID="lblRank" runat="server" ></asp:Label>
            </ItemTemplate>

                        </asp:TemplateField>


                    </Columns>

                </asp:GridView>

下面是排名按钮代码:
受保护的void Rank_Button_Click(对象发送方,事件参数e){

SortedDictionary<double, int> MyRank = new SortedDictionary<double, int>();

        foreach (GridViewRow gRow in GridView1.Rows)
        {

            if (Convert.ToDouble(gRow.Cells[0].Text) != 0)
            {

                double score = Convert.ToDouble(gRow.Cells[0].Text);
                while (MyRank.ContainsKey(score))
                    score += 0.00001;

                MyRank.Add(score, gRow.RowIndex);

                //MyRank.Add(Convert.ToDouble(gRow.Cells[0].Text), gRow.RowIndex);

                gRow.Cells[0].ForeColor = System.Drawing.Color.DarkBlue;
            }
        }

        

        

        for (int irS = 0; irS < GridView1.Rows.Count; irS++)
        {
            if (Convert.ToDouble(GridView1.Rows[irS].Cells[0].Text) > 0)
            {

                ir = ir + 1;

            }
        }

        foreach (KeyValuePair<double, int> OneRank in MyRank)
        {

            GridViewRow gRow = GridView1.Rows[OneRank.Value];
            Label lRank = (Label)gRow.FindControl("lblRank");
            lRank.Text = (ir + 1).ToString();
            ir--;

        }

这成功地显示了模板字段中的排名,如您在示例中所示,但是:
当模板文件上传的排名编号为Gridview中的此列时:Convert.ToInt32(GridView1.Rows[t].Cells[2].Text),我想访问它:

for (int t = 0; t < GridView1.Rows.Count; t++)
            {
   
                        if (Convert.ToInt32(GridView1.Rows[t].Cells[2].Text) < 5 )
                        {
                            labelX.Text = "message";
                        }
                     }

它抛出异常:输入格式不是正确的格式...
如果使用Convert.ToString(GridView1.Rows[t].Cells[2].Text),则不会引发异常,但可以使用t access the integeres(ranking numbers), if I try to convert it into Convert.ToInt32(GridView1.Rows[t].Cells[2].Text)'
它抛出异常....

webghufk

webghufk1#

单元格中的字符串值可能不是int的有效表示形式,Parse方法将抛出FormatException。您能为我们提供您试图转换的值吗?
请尝试改用TryParse方法。

var cellValue = GridView1.Rows[t].Cells[2].Text;

if (Int32.TryParse(cellValue, out int intValue))
{
    // If the conversion was successful, use the int value.
    Console.WriteLine(intValue);
}
else
{
    // If the conversion was not successful, handle the error.
    Console.WriteLine("Error: Invalid number format.");
} ```
66bbxpm5

66bbxpm52#

所以,让我们主要备份卡车在这里。我们没有空白值的排名!!
我的意思是,马上,警钟应该在这里以一种巨大的方式响起!!

We see values in the gv for rank.
We observe the code is setting up rank

然后整个事情是崩溃在一个巨大的火球,因为你现在看到“”或空的排名。现在我们有一群人offing代码如何处理空白值时,我们从来没有空白!!!
谈论跑错路!!!
这里要解决的问题不是如何处理空白,而是发现为什么我们看到一个空白值!!!
也许我真的是在这里浪费时间。我在上一篇文章中明确地说:

for databound columns, you use cells[] to get the value.
for templated columns, you have to use find control.

现在,你为什么不阅读我的建议呢?
因此,尝试从Cells[]集合中提取/使用/获取/抓取等级值将永远不会起作用!
如果gv行的值在模板列中,那么我们不能使用单元格集合。
不过,无论如何,让我们不要使用gv来处理排名。简单地避免这个问题要好得多。
因此,让我们假设这个标记:

<asp:GridView ID="GridView1" runat="server" ClientIDMode="Static"
            AutoGenerateColumns="False" DataKeyNames="ID"
            CssClass="table table-hover" Width="50%" ShowHeaderWhenEmpty="true" OnRowDataBound="GridView1_RowDataBound">
            <Columns>
                <asp:BoundField DataField="FirstName" HeaderText="FirstName" />
                <asp:BoundField DataField="LastName" HeaderText="LastName" />
                <asp:BoundField DataField="HotelName" HeaderText="HotelName" HeaderStyle-Width="120" />
                <asp:BoundField DataField="City" HeaderText="City" />
                <asp:BoundField DataField="Description" HeaderText="Description" />
                <asp:BoundField DataField="Price" HeaderText="Night Rate" DataFormatString="{0:n2}" />
                <asp:TemplateField HeaderText=" Rank by (Price)">
                    <ItemTemplate>
                        <asp:Label ID="lblRank" runat="server" Text = '<%# Eval("Rank") %>' ></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
        </asp:GridView>

因此我们现在有了这个代码:
注意我们是如何对数据进行排名的,而不是对GV。

protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
            LoadGrid();
    }

    void LoadGrid()
    {
        DataTable rstData = new DataTable();
        rstData = MyRst("SELECT * FROM tblHotelsA ORDER BY HotelName");

        // now, lets rank the DATA and NOT the GV
        rstData.Columns.Add("Rank", typeof(int));

        var Ranks = new List<KeyValuePair<decimal, int>>();
        int i = 0;
        foreach (DataRow OneRow in rstData.Rows)
        {
            decimal Price = (decimal)OneRow["Price"];
            Ranks.Add(new KeyValuePair<decimal, int>(Price, i));
            i++;    
        }

        Ranks = Ranks.OrderBy(o => o.Key).ToList(); // sort the list
        decimal LastValue = -1;
        int Rank = 0;
        foreach (KeyValuePair<decimal, int> OneRank in Ranks)
        {
            if (LastValue != OneRank.Key)
                Rank++;
            rstData.Rows[OneRank.Value]["Rank"] = Rank;
            LastValue = OneRank.Key;
        }

        GridView1.DataSource = rstData;
        GridView1.DataBind();
    }

所以,我们现在看到这个:

因此,请注意,在数据表中添加“Rank”列要好得多。
然后我们对数据而不是GV运行排名代码。
现在,假设由于某种原因,我们想让前5是浅蓝色,然后任何大于5的都是深蓝色。
那么,我们就可以使用row数据绑定事件,我们可以做到这一点,而且再一次,我们甚至不必使用gv数据,但我们可以使用+ enjoy这里使用的数据行值。(因此,不需要混乱的类型转换!!!)
那么,说这个代码:

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            DataRowView OneDataRow = (DataRowView)e.Row.DataItem;
            // we can use cells colleciton to fomrat background,
            GridViewRow OneGridRow = e.Row;
            if ((int)OneDataRow["Rank"] <= 5)
                OneGridRow.Cells[6].BackColor = System.Drawing.Color.SkyBlue;
            else
                OneGridRow.Cells[6].BackColor = System.Drawing.Color.SteelBlue;
        }
    }

现在我们看到/得到这个:

所以这个故事真实的的寓意是什么?
正如我所说的,我们希望尝试和数据一起工作,而不是反对GV。
但是,为了便于学习,我们从GV中PULL等级值,在上面的示例中,等级值是一个模板列,而不是数据绑定列。
所以,记住这条规则:

databound columns = cells
tempatled column = we must use find control.

因此,我们用于构造列的行数据绑定事件现在将变为:

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            Label MyLableRank = (Label)e.Row.FindControl("lblRank");
            // we can use cells colleciton to fomrat background,
            int MyRank = Convert.ToInt32(MyLableRank.Text);
            if (MyRank  <= 5)
                e.Row.Cells[6].BackColor = System.Drawing.Color.SkyBlue;
            else
                e.Row.Cells[6].BackColor = System.Drawing.Color.SteelBlue;
        }
    }

那么,如果我们正在/将要/考虑/将要/接受从gv行获取值的想法呢?那么上面展示了我们是如何做到这一点的,因为正如所指出的,ANY AND ALL模板化列要求我们对每一行使用find控件,获取控件类型,然后从控件中拉取值-我们不能再对此类模板化列使用单元格集合。

相关问题