特定のコンテンツタイプのFieldRendingControlを使用してください
-
09-12-2019 - |
質問
新しいフォームのような機能するWebPartを作成しています。ビューに基づいて、私はフィールドに乗って、SPField.FieldRenderingControlを使用して私のWebPartでそれらをレンダリングします。
マイ列はサイト列で、このレベルでは必要にされたものが必要で、リストに追加されたコンテンツタイプに追加されました。リストに追加された後、必須ではなかった特定の列が必要になりましたが、サイト列レベルで必要な一部は現在ではありません。
は私が私のフォームをレンダリングするために使用しているコードです。私が試したことに関係なく、コントロールのレンダリングはリストのコンテンツの種類レベルではなく、サイトの列レベルから把握されているようです。SPFieldLinkからコントロールをレンダリングできません。
私は私が修正が必要な領域の周囲のコード内にコメントを入れました。
try
{
Table table = new Table();
table.CssClass = "hlwp_DSCreateEditTable";
TableRow row;
TableCell cell;
SPContentType ct = spList.ContentTypes[ContentTypeName];
for (int i = 0; i < spView.ViewFields.Count; i++)
{
string fieldName = spView.ViewFields[i];
//The flink holds the information at the content type level in the list.
SPFieldLink flink = ct.FieldLinks[fieldName];
SPField field = spList.Fields.GetField(fieldName);
row = new TableRow();
row.CssClass = "hlwp_DSCreateEditRow";
cell = new TableCell();
cell.CssClass = "hlwp_DSCreateEditTitleCell";
//Even tried setting the field.required to match the flink.required.
//When debugging and following the code through it stays the same as flink.required,
//but if you call Page.Validate() it displays errors on the controls
//that are required at the site column level not list content type level.
if (flink != null)
{
field.Required = flink.Required;
}
if (field.Required)
{
cell.Text = field.Title + "<font color='red'>*</font>";
}
else
{
cell.Text = field.Title;
}
row.Cells.Add(cell);
cell = new TableCell();
cell.CssClass = "hlwp_DSCreateEditControlCell";
Control cntrl = HelperClass.GetSharePointControls(field, spList, itemId);
if (cntrl == null) continue;
cell.Controls.Add(cntrl);
row.Cells.Add(cell);
table.Rows.Add(row);
}
.
HelperClass.GetSharePointControls
public static Control GetSharePointControls(SPField field, SPList list, int itemId)
{
// check if the field is a buildIn field, or can be rendered by a SharePoint Control
if (field == null || field.FieldRenderingControl == null || field.Hidden) return null;
Control ctrl = null;
SPControlMode mode = SPControlMode.Invalid;
if (itemId > 0)
mode = SPControlMode.Edit;
else
mode = SPControlMode.New;
//Wondering if it's something to do with the context, as later on you set this context to the RenderingContext.
var controlContext = SPContext.GetContext(System.Web.HttpContext.Current, itemId, list.ID, SPContext.Current.Web);
SPContext.Current.FormContext.SetFormMode(mode, true);
controlContext.FormContext.SetFormMode(mode, true);
try
{
BaseFieldControl webControl = field.FieldRenderingControl;
webControl.ListId = list.ID;
webControl.ControlMode = mode;
webControl.ItemId = itemId;
webControl.FieldName = field.Title;
webControl.ID = GetControlID(field); //Creates a unique ID.
webControl.RenderContext = controlContext;
webControl.ItemContext = controlContext;
ctrl = webControl;
}
return ctrl;
}
catch (Exception ex)
{
var errorLabel = new Label
{
ID = "ErrorLabel",
Text = String.Format("Error in GetSharePointControls:<br/>{0}", ex)
};
return errorLabel;
}
}
.
誰かがいかなるアイデアがあるならば、私は非常に感謝します。私は限られた成功を持つマイクロソフトコードを反映しようとしました。
解決 2
これをさらに見て、SPFIELSがリストフィールドの必須ステータスで読み取るように見えます。ただし、カスタムリストでは、リスト設定で列名をクリックして必要なフィールドを編集できます。
文書ライブラリの場合は、必要なフィールド設定が欠落しています。必要なフィールドを設定できる唯一の方法は、サイトのコンテンツの種類のどちらかで、変更を押し下げます(指定されたリストだけでなく、それを使用する場合は必須フィールドを変更する)、または.NETまたはPowerShellを使用してコードを入力します。必要に応じてリストのフィールドを設定します。次に、SPFieldLinkへの元のコードで参照をすべて削除します。
$web = Get-SPWeb "[YourSite]"
$list = $web.GetListFromUrl("[Your List URL]")
$field = $list.Fields["[Field Name"]
Write-Host "Previous Value:" $field.Required
$field.Required = $true
$field.Update()
Write-Host "The field" $field.Title "is now set to" $field.Required
.
投稿したオリジナルコードが文書ライブラリと比較してカスタムリストが非常に異なっているのは奇妙です。
私はこれを発見しました。ローカルの説明がサイトの列の説明と異なる場合は、フィールド.Descriptionを呼び出すと、常にローカルの説明があります。これは、リストからSPFieldを呼び出すことを意味し、サイト列からのリストに記載されている列からの値を入力しました。それで、リストの列が必要な場合はクエリを抑制し、サイト列にいましたが、リストのためのものではありませんでした。
PowerShellを使用する代わりに、ライブラリ設定から呼び出すレイアウトページを作成することは、リスト内の各列に対して必要な値を変更することを可能にするレイアウトページを作成します。 (私はまだ見つかったことがない良い理由のために)
他のヒント
CodePlexプロジェクトのバッチ編集方法を表示する多分確認:> http://sp2010batchedit.codeplex.com/