C# 使用 ASP.NET 在加载时更改我的 GridView 中的值
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/755027/
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
Changing values inside my GridView on load with ASP.NET
提问by Etienne
I have a GridView that gets populated with data from a SQL database, very easy. Now i want to replace values in my one column like so......
我有一个 GridView,它填充了来自 SQL 数据库的数据,非常简单。现在我想像这样替换我的一列中的值......
If c04_oprogrs value is a 1 then display Takein the GridView.
如果 c04_oprogrs 值为 1,则在 GridView 中显示Take。
If c04_oprogrs value is 2 then display Availablein the GridView.
如果 c04_oprogrs 值为 2,则在 GridView 中显示可用。
What code changes must i make to change to my code to display the new values.
我必须更改哪些代码才能更改我的代码以显示新值。
My Grid
我的网格
<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>
My Page load
我的页面加载
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:
编辑:
MY FINAL SOLUTION
我的最终解决方案
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";
}
}
}
采纳答案by Ronald Wildenberg
You can use the RowDataBound
event for this. Using this event you can alter the content of specific columns before the grid is rendered.
您可以RowDataBound
为此使用该事件。使用此事件,您可以在呈现网格之前更改特定列的内容。
To clarify a little. First you add a template column with a label to your grid view (see also the answer by ranomore):
澄清一点。首先,您将带有标签的模板列添加到您的网格视图中(另请参阅 ranomore 的答案):
<asp:TemplateField>
<ItemTemplate>
<asp:Label ID="myLabel" runat="server" />
</ItemTemplate>
</asp:TemplateField>
Next you implement the RowDataBound
event (I haven't checked the code below, so it may contain some syntax errors):
接下来你实现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";
}
}
}
回答by shahkalpesh
You could add a field in the SQL Statement
您可以在 SQL 语句中添加一个字段
adapter = new SqlDataAdapter("Select TOP 40 c04_credno, c04_orderno, c04_orddate,
c04_ordval, c04_delval, c04_invval, c04_oprogrs, c04_orddesc ,
CASE c04_oprogrs WHEN 1 THEN "Take" WHEN 2 THEN "Available" ELSE "DontKnow" END AS
Status FROM C04ORDS WHERE c04_credno = '" + Session["CreditorNumber"] + "'AND
c04_oprogrs 9 ORDER BY c04_orddate DESC", myConnection);
And make that new field part of the BoundColumn in the markup.
Pardon my SQL syntax but I hope you get the idea.
并使该新字段成为标记中 BoundColumn 的一部分。
请原谅我的 SQL 语法,但我希望你能明白。
EDIT: Do not use the syntax = '" + Session["CreditorNumber"] + "'
.
See sql injection attack and how to avoid it using parameterized SQL.
编辑:不要使用语法= '" + Session["CreditorNumber"] + "'
。
请参阅 sql 注入攻击以及如何使用参数化 SQL 避免它。
回答by Dave Neeley
You could use a template column and call a function in your code behind.
您可以使用模板列并在后面的代码中调用函数。
<asp:TemplateField>
<ItemTemplate>
<asp:Label runat="server" Text='<%#FieldDisplay(Eval("c04_oprogrs")) %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
then in your code behind do
然后在你后面的代码中做
protected string FieldDisplay(int c04_oprogrs)
{
string rtn = "DefaultValue";
if (c04_oprogrs == 1)
{
rtn = "Take";
}
else if (c04_oprogrs == 2)
{
rtn = "Available";
}
return rtn;
}
回答by rvarcher
Without using a function. The ternary statement is in VB. If you have to nest another ternary statement to really test for 2 then it'd be easier to go with rwwilden's solution.
不使用函数。三元语句在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>
回答by Faiz Kazi
This is the best efficient way. Make a case in sql server view, like :-
这是最有效的方法。在 sql server 视图中创建一个案例,例如:-
select case <columnname>
when 1 then 'available'
when 0 then 'not available'
end as <columnname>
from <tablename>