Изменение значений внутри моего GridView при загрузке с ASP.NET - PullRequest
4 голосов
/ 16 апреля 2009

У меня есть GridView, который заполняется данными из базы данных SQL, очень просто. Теперь я хочу заменить значения в одном столбце следующим образом ......

Если значение c04_oprogrs равно 1, тогда в GridView отобразится Take .

Если значение c04_oprogrs равно 2, то в GridView отобразится Доступно .

Какие изменения кода я должен сделать, чтобы изменить свой код для отображения новых значений.

Моя Сетка

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
                Height="281px" Width="940px" 
                Font-Size="X-Small" AllowPaging="True" 
                onpageindexchanging="GridView1_PageIndexChanging">
                <Columns>
                    <asp:BoundField DataField="c04_oprogrs" HeaderText="Order Progress" 
                        SortExpression="c04_oprogrs" />
                    <asp:BoundField DataField="c04_orderno" HeaderText="Order No." 
                        SortExpression="c04_orderno" />
                    <asp:BoundField DataField="c04_orddate" HeaderText="Date of Order" 
                        SortExpression="c04_orddate" DataFormatString="{0:d/MM/yyyy}" />
                    <asp:BoundField DataField="c04_ordval" HeaderText="Order Value" 
                        SortExpression="c04_ordval" DataFormatString="{0:R#,###,###.00}" />
                    <asp:BoundField DataField="c04_delval" HeaderText="Delivered Value" 
                        SortExpression="c04_delval" DataFormatString="{0:R#,###,###.00}" />
                    <asp:BoundField DataField="c04_invval" HeaderText="Invoice Value" 
                        SortExpression="c04_invval" DataFormatString="{0:R#,###,###.00}" />
                    <asp:BoundField DataField="c04_orddesc" HeaderText="Order Description" 
                        SortExpression="c04_orddesc" >
                        <ControlStyle Width="300px" />
                    </asp:BoundField>
                </Columns>
            </asp:GridView>

загрузка моей страницы

SqlConnection myConnection;
        DataSet dataSet = new DataSet();
        SqlDataAdapter adapter;

        //making my connection
        myConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["SAMRASConnectionString"].ConnectionString);

        adapter = new SqlDataAdapter("Select TOP 40 c04_credno, c04_orderno, c04_orddate, c04_ordval, c04_delval, c04_invval, c04_oprogrs, c04_orddesc FROM C04ORDS WHERE c04_credno = '" + Session["CreditorNumber"] + "'AND c04_oprogrs <> 9 ORDER BY c04_orddate DESC", myConnection);

        adapter.Fill(dataSet, "MyData");

        GridView1.DataSource = dataSet;
        Session["DataSource"] = dataSet;
        GridView1.DataBind();

Etienne

EDIT:

МОЕ ФИНАЛЬНОЕ РЕШЕНИЕ

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            // Find the value in the c04_oprogrs column. You'll have to use

            string value = e.Row.Cells[0].Text;

            if (value == "1")
            {
                e.Row.Cells[0].Text = "Take";
            }
            else if (value == "2")
            {
                e.Row.Cells[0].Text = "Available";
            }
        }

    }

Ответы [ 5 ]

8 голосов
/ 16 апреля 2009

Вы можете использовать для этого событие RowDataBound. Используя это событие, вы можете изменить содержимое определенных столбцов до отображения сетки.

Чтобы уточнить немного. Сначала вы добавляете столбец шаблона с меткой в ​​сетку (см. Также ответ от ranomore):

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

Затем вы реализуете событие RowDataBound (я не проверял приведенный ниже код, поэтому он может содержать некоторые синтаксические ошибки):

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if(e.Row.RowType == DataControlRowType.DataRow)
    {
        // Find the value in the c04_oprogrs column. You'll have to use
        // some trial and error here to find the right control. The line
        // below may provide the desired value but I'm not entirely sure.
        string value = e.Row.Cells[0].Text;

        // Next find the label in the template field.
        Label myLabel = (Label) e.Row.FindControl("myLabel");
        if (value == "1")
        {
            myLabel.Text = "Take";
        }
        else if (value == "2")
        {
            myLabel.Text = "Available";
        }
    }
}
2 голосов
/ 16 апреля 2009

Без использования функции. Тройное утверждение есть в VB. Если вам нужно вложить еще одно троичное выражение, чтобы действительно проверить на 2, тогда было бы проще воспользоваться решением rwwilden.

<asp:TemplateField HeaderText="Order Progress" SortExpression="c04_oprogrs" >
    <ItemTemplate>
        <asp:Label runat="server" ID="Label1" Text='<%# IIF(CInt(Eval("c04_oprogrs")) = 1, "Take", "Available") %>' />
    </ItemTemplate>
</asp:TemplateField>
2 голосов
/ 16 апреля 2009

Вы можете использовать шаблонный столбец и вызывать функцию в своем коде.

    <asp:TemplateField>
        <ItemTemplate>
                       <asp:Label runat="server" Text='<%#FieldDisplay(Eval("c04_oprogrs")) %>'></asp:Label>
        </ItemTemplate>
    </asp:TemplateField>

тогда в вашем коде позади сделайте

protected string FieldDisplay(int c04_oprogrs)
{
 string rtn = "DefaultValue";
 if (c04_oprogrs == 1)
 {
    rtn = "Take";
 }
 else if (c04_oprogrs == 2)
 {
    rtn = "Available";
 }
 return rtn;
}
1 голос
/ 16 апреля 2009

Вы можете добавить поле в операторе SQL


adapter = new SqlDataAdapter("Select TOP 40 c04_credno, c04_orderno, c04_orddate,  
c04_ordval, c04_delval, c04_invval, c04_oprogrs, c04_orddesc <b>,  
CASE c04_oprogrs WHEN 1 THEN "Take" WHEN 2 THEN "Available" ELSE "DontKnow" END AS  
Status</b> FROM C04ORDS WHERE c04_credno = '" + Session["CreditorNumber"] + "'AND  
c04_oprogrs  9 ORDER BY c04_orddate DESC", myConnection);

И сделайте это новое поле частью BoundColumn в разметке.
Извините за синтаксис SQL, но я надеюсь, что вы поняли идею.

РЕДАКТИРОВАТЬ: не использовать синтаксис = '" + Session["CreditorNumber"] + "'.
См. SQL-инъекцию и как ее избежать с помощью параметризованного SQL.

0 голосов
/ 19 июля 2012

Это самый эффективный способ. Создайте регистр в виде сервера SQL, например: -

select case <columnname> 
       when 1 then 'available' 
       when 0 then 'not available' 
       end as <columnname> 
from <tablename>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...