我搜索了这个,答案似乎没有用。我在C#代码隐藏中获得了以下功能:
public void Show_Data2(string LPI_ID)
{
OracleConnection conn = GetConnection();
try
{
{
//conn.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["ConnCST"].ToString();
OracleCommand cmd3 = new OracleCommand();
cmd3.CommandType = CommandType.StoredProcedure;
cmd3.CommandText = "SP_LPI_REGISTER_CLAIM_DETAILS";
cmd3.Connection = conn;
cmd3.Parameters.Add("vLPI_ID", OracleType.VarChar, 20).Value = LPI_ID;
cmd3.Parameters.Add("vClaimDetails", OracleType.Cursor).Direction = ParameterDirection.Output;
//connection2.Open();
var SearchAdapter = new OracleDataAdapter(cmd3);
var ds = new DataSet();
SearchAdapter.Fill(ds);
DataGrid_ClaimDetail.DataSource = ds;
DataGrid_ClaimDetail.DataBind();
// The problem happens here:
DataGrid_ClaimDetail.Columns["Item"].DisplayIndex = 0;
DataGrid_ClaimDetail.Columns["dt"].DisplayIndex = 1;
DataGrid_ClaimDetail.Columns["UserName"].DisplayIndex = 2;
if (DataGrid_ClaimDetail.Items.Count < 1)
{
lblEmpty2.Visible = true;
lblEmpty2.Text = "There is no data to display";
}
else
{
lblEmpty2.Visible = false;
}
conn.Close();
}
}
catch (Exception ex)
{
Response.Write(ex.Message);
conn.Close();
}
}
我在asp.net中有以下DataGrid:
<div id="divGrid2" style='width:920px; height:230px; overflow:auto;'>
<asp:DataGrid ID="DataGrid_ClaimDetail" runat="server" Visible="true"
AllowPaging="True" AllowSorting="True" CellPadding="4" ForeColor="#333333" GridLines="None" AutoGenerateColumns="true"
OnCancelCommand="DataGrid_ClaimDetail_CancelCommand"
OnUpdateCommand="DataGrid_ClaimDetail_UpdateCommand"
OnEditCommand="DataGrid_ClaimDetail_EditCommand">
<AlternatingItemStyle Font-Bold="False" Font-Italic="False"
Font-Overline="False" Font-Strikeout="False" Font-Underline="False" />
<EditItemStyle BackColor="#999999" Font-Bold="False" Font-Italic="False"
Font-Overline="False" Font-Strikeout="False" Font-Underline="False" />
<FooterStyle BackColor="#5D7B9D" Font-Bold="False" Font-Italic="False"
Font-Overline="False" Font-Strikeout="False" Font-Underline="False" />
<HeaderStyle BackColor="#5D7B9D" Font-Bold="False" Font-Italic="False"
Font-Overline="False" Font-Strikeout="False" Font-Underline="False" />
<PagerStyle BackColor="#5D7B9D" Font-Bold="False" Font-Italic="False"
Font-Overline="False" Font-Strikeout="False" Font-Underline="False" />
<SelectedItemStyle BackColor="#E2DED6" Font-Bold="False" Font-Italic="False"
Font-Overline="False" Font-Strikeout="False" Font-Underline="False" />
<Columns>
<asp:EditCommandColumn ButtonType="PushButton" CancelText="Cancel"
EditText="Select" UpdateText="Update"></asp:EditCommandColumn>
</Columns>
</asp:DataGrid>
<asp:Label ID="lblEmpty2" runat="server" Visible="false" Style="font-weight:bold; font-size:large;"></asp:Label>
</div>
如果我在C#代码中取出3个DisplayIndex行,它可以正常工作,但我的字段不是我喜欢的顺序。
如果我重新放入这些行,我会在每行代码上出错:
无法转换为&#39; string&#39;到&#39; int&#39;
并且每个字段名称都带有下划线。
任何人都可以看到我可能做错了什么,或者告诉我如何能够重新排序GridView中的字段?
答案 0 :(得分:0)
DataGrid.Columns
collection只有this[Int32]
索引器,因此您无法按名称(cannot convert from 'string' to 'int'
)访问其项目。要使用它,您必须知道所需的索引:
DataGrid_ClaimDetail.Columns[3].DisplayIndex = 0;
那你怎么用他们的名字得到专栏?
DataGridColumn
上似乎没有Name
属性,但您可以尝试使用每列的HeaderText
属性,标准数据绑定方案中的属性应该等于原始属性数据库列名:
var columns = DataGrid_ClaimDetail
.Columns
.Cast<DataGridColumn>()
.Where(col => // Not sure but some button columns may be headerless
!String.IsNullOrEmpty(col.HeaderText))
.ToDictionary(
keySelector: col => col.HeaderText,
comparer: StringComparer.OrdinalIgnoreCase);
columns["Item"].DisplayIndex = 0;
或者您可以尝试使用BoundColumn.DataField
:
var columns = DataGrid_ClaimDetail
.Columns
.OfType<BoundColumn>()
.ToDictionary((
keySelector: col => col.DataField,
comparer: StringComparer.OrdinalIgnoreCase);
答案 1 :(得分:0)
经过一些反复试验,我找到了解决方案。
我做的第一件事是从DataSet更改为DataTable。这允许我使用SetOrdinal属性。它还允许我在代码隐藏中使用Visible属性。
var SearchAdapter = new OracleDataAdapter(cmd3);
var ds = new DataTable();
SearchAdapter.Fill(ds);
ds.Columns[0].SetOrdinal(1);
ds.Columns[1].SetOrdinal(2);
ds.Columns[2].SetOrdinal(3);
DataGrid_ClaimDetail.DataSource = ds;
DataGrid_ClaimDetail.DataBind();
DataGrid_ClaimDetail.Columns[4].Visible = false;
为了做到这一点,我不得不将ASP端的AutoGenerateColumns更改为&#34; false&#34;。然后,我在<Columns>
标记中对列名进行了硬编码:
<Columns>
<asp:EditCommandColumn ButtonType="PushButton" CancelText="Cancel"
EditText="Select" UpdateText="Update"></asp:EditCommandColumn>
<asp:BoundColumn HeaderText="Status" DataField="Item" />
<asp:BoundColumn HeaderText="Date" DataField="dt" />
<asp:BoundColumn HeaderText="Who" DataField="UserName" />
<asp:BoundColumn HeaderText="UserID" DataField="UserID" ItemStyle-Width="0px" />
</Columns>
通过更改列的Visible属性,它仍允许我访问UserID字段中存储的值(在EditCommandColumn中创建的按钮的OnClick事件中使用它)。
不像我希望的那样完全,但它完成了工作。