我需要针对填充LINQ
的{{1}}进行GridView
查询 - 从行创建字典。
所以我有:
SqlDataSource
和
<asp:GridView runat="server" ID="gridCurrency" DataSourceID="sourceCurrency" OnDataBound="gridCurrency_DataBound"
<asp:SqlDataSource runat="server" ID="sourceCurrency" ConnectionString="<%$ ConnectionStrings:MyConnStr %>" SelectCommand="[getCurrencies]" SelectCommandType="StoredProcedure" />
有没有比protected void gridCurrency_DataBound(object sender, EventArgs e)
{
var dic = (from row in ((DataView)sourceCurrency.Select(DataSourceSelectArguments.Empty)).Table.AsEnumerable()
select new
{
ID = (byte)row["ID"],
CurrencyName = (string)row["name"]
}).ToDictionary(k => k.ID, k => k.CurrencyName);
}
DataTable
更好的方法,而GridView
没有GridView.DataSouce
。
答案 0 :(得分:1)
我更喜欢在我的代码隐藏中绑定我的服务器控件。我可以更好地调试和测试它。我也不必做其他疯狂的事情来从代码隐藏中获取我的绑定数据......它已经存在了。这是一个例子。
在SQL中假设以下存储过程:
CREATE PROCEDURE selEmployees
@DeptId int,
@SearchString varchar(100)
AS
BEGIN
SELECT TOP 1000 * FROM Employees
WHERE DeptId = @DeptId AND CONTAINS(*, SearchString);
END
我可以将存储过的proc与我的实体类或页面代码隐藏中的方法匹配,如下所示:
public static DataSet selEmployees(int DeptId, string SearchString)
{
DataSet ds = new DataSet();
SqlConnection con = new SqlConnection(clsData.getConnString());
SqlCommand cmd = new SqlCommand("selEmployees", con); // stored proc name
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter _DeptId = cmd.Parameters.Add("@DeptId", SqlDbType.Int); //stored proc parameter name and datatype
_DeptId.Value = DeptId; //assign method parameter value to sql parameter
SqlParameter _SearchString = cmd.Parameters.Add("@SearchString", SqlDbType.Int); //stored proc parameter name and datatype
_SearchString.Value = SearchString; //assign method parameter value to sql parameter
SqlDataAdapter adapt = new SqlDataAdapter(cmd);
adapt.SelectCommand = cmd;
con.Open();
try
{
adapt.Fill(ds);
}
catch (Exception ex)
{
string msg = ex.ToString();
}
finally
{
con.Close();
con.Dispose();
}
return ds;
}
然后,我可以将我的数据绑定到page_load上的服务器控件,如下所示:
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
GridView1.DataSource = Employees.selEmployees(MyDeptId, MySearchString);
GridView1.DataBind();
}
}
如果您尝试这样做,请务必从标记中的GridView中删除DataSourceId参数。 DataSource和DataSourceId不能很好地协同工作。
注意:实际上有一百万种更好的方法可以做到这一点。这篇文章的目的是说明在标记中使用SqlDataSource的一种简单替代方法。
更进一步的一种方法是将结果数据集分配给可重用的变量,如页面属性:
public partial class ViewEmployees : System.Web.UI.Page
{
public DataSet DataSetEmployees { get; set; } //re-usable property gets set at page_load
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
//save the dataset to a re-usable property
DataSetEmployees = Employees.selEmployees(MyDeptId, MySearchString);
//bind using the property
GridView1.DataSource = DataSetEmployees;
GridView1.DataBind();
}
}
}
通过这种简单的升级,您可以在整个页面中使用和重用DataSet,而无需重新查询数据库。